{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "采用PCA KPCA LDA 做数据降维以美国油田为例.ipynb",
      "provenance": [],
      "toc_visible": true,
      "authorship_tag": "ABX9TyPkY8ULa+XMuBh0ceNss2Ke",
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/sunyingjian/-Logging-related-network/blob/master/%E9%87%87%E7%94%A8PCA_KPCA_LDA_%E5%81%9A%E6%95%B0%E6%8D%AE%E9%99%8D%E7%BB%B4%E4%BB%A5%E7%BE%8E%E5%9B%BD%E6%B2%B9%E7%94%B0%E4%B8%BA%E4%BE%8B.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Cqy3vXXOMI06",
        "colab_type": "text"
      },
      "source": [
        "### <font size=5px color=\"red\">✦ *Google Colab 突破90分钟自动断开:</font>\n",
        "<p><font size=3px > 每60分钟自动运行代码以刷新90分钟断开限制. 打开 developer-settings (在你的浏览器) 快速健 Ctrl+Shift+I 然后按console 输入以下代码 Enter. ( mac 按 Option+Command+I)</p><b>复制以下隐藏代码粉贴在浏览器console！！不要关闭浏览器以免失效</b>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3Z8cK8h2Avbv",
        "colab_type": "text"
      },
      "source": [
        "<code>function ClickConnect(){\n",
        "console.log(\"Working\"); \n",
        "document.querySelector(\"colab-connect-button\").click() \n",
        "}setInterval(ClickConnect,6000)</code>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "jtClEMAMLVHw",
        "colab_type": "code",
        "cellView": "both",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "outputId": "d64891b1-3a71-412f-8cc3-af43829e8719"
      },
      "source": [
        "#@markdown <h3>← 输入了代码后运行以防止断开</h>\n",
        "\n",
        "\n",
        "import IPython\n",
        "from google.colab import output\n",
        "\n",
        "display(IPython.display.Javascript('''\n",
        " function ClickConnect(){\n",
        "   btn = document.querySelector(\"colab-connect-button\")\n",
        "   if (btn != null){\n",
        "     console.log(\"Click colab-connect-button\"); \n",
        "     btn.click() \n",
        "     }\n",
        "   \n",
        "   btn = document.getElementById('ok')\n",
        "   if (btn != null){\n",
        "     console.log(\"Click reconnect\"); \n",
        "     btn.click() \n",
        "     }\n",
        "  }\n",
        "  \n",
        "setInterval(ClickConnect,60000)\n",
        "'''))\n",
        "\n",
        "print(\"Done.\")"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "application/javascript": [
              "\n",
              " function ClickConnect(){\n",
              "   btn = document.querySelector(\"colab-connect-button\")\n",
              "   if (btn != null){\n",
              "     console.log(\"Click colab-connect-button\"); \n",
              "     btn.click() \n",
              "     }\n",
              "   \n",
              "   btn = document.getElementById('ok')\n",
              "   if (btn != null){\n",
              "     console.log(\"Click reconnect\"); \n",
              "     btn.click() \n",
              "     }\n",
              "  }\n",
              "  \n",
              "setInterval(ClickConnect,60000)\n"
            ],
            "text/plain": [
              "<IPython.core.display.Javascript object>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "stream",
          "text": [
            "Done.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2Kt3s4toryUA",
        "colab_type": "text"
      },
      "source": [
        "#准备数据"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9X6siHUprwnl",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 207
        },
        "outputId": "9b80cf52-51de-4bb8-dde5-b998b751f215"
      },
      "source": [
        "! git clone https://github.com/sunyingjian/numpy-.git\n",
        "! git clone https://github.com/seg/tutorials-2016.git"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Cloning into 'numpy-'...\n",
            "remote: Enumerating objects: 59, done.\u001b[K\n",
            "remote: Counting objects:   1% (1/59)\u001b[K\rremote: Counting objects:   3% (2/59)\u001b[K\rremote: Counting objects:   5% (3/59)\u001b[K\rremote: Counting objects:   6% (4/59)\u001b[K\rremote: Counting objects:   8% (5/59)\u001b[K\rremote: Counting objects:  10% (6/59)\u001b[K\rremote: Counting objects:  11% (7/59)\u001b[K\rremote: Counting objects:  13% (8/59)\u001b[K\rremote: Counting objects:  15% (9/59)\u001b[K\rremote: Counting objects:  16% (10/59)\u001b[K\rremote: Counting objects:  18% (11/59)\u001b[K\rremote: Counting objects:  20% (12/59)\u001b[K\rremote: Counting objects:  22% (13/59)\u001b[K\rremote: Counting objects:  23% (14/59)\u001b[K\rremote: Counting objects:  25% (15/59)\u001b[K\rremote: Counting objects:  27% (16/59)\u001b[K\rremote: Counting objects:  28% (17/59)\u001b[K\rremote: Counting objects:  30% (18/59)\u001b[K\rremote: Counting objects:  32% (19/59)\u001b[K\rremote: Counting objects:  33% (20/59)\u001b[K\rremote: Counting objects:  35% (21/59)\u001b[K\rremote: Counting objects:  37% (22/59)\u001b[K\rremote: Counting objects:  38% (23/59)\u001b[K\rremote: Counting objects:  40% (24/59)\u001b[K\rremote: Counting objects:  42% (25/59)\u001b[K\rremote: Counting objects:  44% (26/59)\u001b[K\rremote: Counting objects:  45% (27/59)\u001b[K\rremote: Counting objects:  47% (28/59)\u001b[K\rremote: Counting objects:  49% (29/59)\u001b[K\rremote: Counting objects:  50% (30/59)\u001b[K\rremote: Counting objects:  52% (31/59)\u001b[K\rremote: Counting objects:  54% (32/59)\u001b[K\rremote: Counting objects:  55% (33/59)\u001b[K\rremote: Counting objects:  57% (34/59)\u001b[K\rremote: Counting objects:  59% (35/59)\u001b[K\rremote: Counting objects:  61% (36/59)\u001b[K\rremote: Counting objects:  62% (37/59)\u001b[K\rremote: Counting objects:  64% (38/59)\u001b[K\rremote: Counting objects:  66% (39/59)\u001b[K\rremote: Counting objects:  67% (40/59)\u001b[K\rremote: Counting objects:  69% (41/59)\u001b[K\rremote: Counting objects:  71% (42/59)\u001b[K\rremote: Counting objects:  72% (43/59)\u001b[K\rremote: Counting objects:  74% (44/59)\u001b[K\rremote: Counting objects:  76% (45/59)\u001b[K\rremote: Counting objects:  77% (46/59)\u001b[K\rremote: Counting objects:  79% (47/59)\u001b[K\rremote: Counting objects:  81% (48/59)\u001b[K\rremote: Counting objects:  83% (49/59)\u001b[K\rremote: Counting objects:  84% (50/59)\u001b[K\rremote: Counting objects:  86% (51/59)\u001b[K\rremote: Counting objects:  88% (52/59)\u001b[K\rremote: Counting objects:  89% (53/59)\u001b[K\rremote: Counting objects:  91% (54/59)\u001b[K\rremote: Counting objects:  93% (55/59)\u001b[K\rremote: Counting objects:  94% (56/59)\u001b[K\rremote: Counting objects:  96% (57/59)\u001b[K\rremote: Counting objects:  98% (58/59)\u001b[K\rremote: Counting objects: 100% (59/59)\u001b[K\rremote: Counting objects: 100% (59/59), done.\u001b[K\n",
            "remote: Compressing objects:   1% (1/59)\u001b[K\rremote: Compressing objects:   3% (2/59)\u001b[K\rremote: Compressing objects:   5% (3/59)\u001b[K\rremote: Compressing objects:   6% (4/59)\u001b[K\rremote: Compressing objects:   8% (5/59)\u001b[K\rremote: Compressing objects:  10% (6/59)\u001b[K\rremote: Compressing objects:  11% (7/59)\u001b[K\rremote: Compressing objects:  13% (8/59)\u001b[K\rremote: Compressing objects:  15% (9/59)\u001b[K\rremote: Compressing objects:  16% (10/59)\u001b[K\rremote: Compressing objects:  18% (11/59)\u001b[K\rremote: Compressing objects:  20% (12/59)\u001b[K\rremote: Compressing objects:  22% (13/59)\u001b[K\rremote: Compressing objects:  23% (14/59)\u001b[K\rremote: Compressing objects:  25% (15/59)\u001b[K\rremote: Compressing objects:  27% (16/59)\u001b[K\rremote: Compressing objects:  28% (17/59)\u001b[K\rremote: Compressing objects:  30% (18/59)\u001b[K\rremote: Compressing objects:  32% (19/59)\u001b[K\rremote: Compressing objects:  33% (20/59)\u001b[K\rremote: Compressing objects:  35% (21/59)\u001b[K\rremote: Compressing objects:  37% (22/59)\u001b[K\rremote: Compressing objects:  38% (23/59)\u001b[K\rremote: Compressing objects:  40% (24/59)\u001b[K\rremote: Compressing objects:  42% (25/59)\u001b[K\rremote: Compressing objects:  44% (26/59)\u001b[K\rremote: Compressing objects:  45% (27/59)\u001b[K\rremote: Compressing objects:  47% (28/59)\u001b[K\rremote: Compressing objects:  49% (29/59)\u001b[K\rremote: Compressing objects:  50% (30/59)\u001b[K\rremote: Compressing objects:  52% (31/59)\u001b[K\rremote: Compressing objects:  54% (32/59)\u001b[K\rremote: Compressing objects:  55% (33/59)\u001b[K\rremote: Compressing objects:  57% (34/59)\u001b[K\rremote: Compressing objects:  59% (35/59)\u001b[K\rremote: Compressing objects:  61% (36/59)\u001b[K\rremote: Compressing objects:  62% (37/59)\u001b[K\rremote: Compressing objects:  64% (38/59)\u001b[K\rremote: Compressing objects:  66% (39/59)\u001b[K\rremote: Compressing objects:  67% (40/59)\u001b[K\rremote: Compressing objects:  69% (41/59)\u001b[K\rremote: Compressing objects:  71% (42/59)\u001b[K\rremote: Compressing objects:  72% (43/59)\u001b[K\rremote: Compressing objects:  74% (44/59)\u001b[K\rremote: Compressing objects:  76% (45/59)\u001b[K\rremote: Compressing objects:  77% (46/59)\u001b[K\rremote: Compressing objects:  79% (47/59)\u001b[K\rremote: Compressing objects:  81% (48/59)\u001b[K\rremote: Compressing objects:  83% (49/59)\u001b[K\rremote: Compressing objects:  84% (50/59)\u001b[K\rremote: Compressing objects:  86% (51/59)\u001b[K\rremote: Compressing objects:  88% (52/59)\u001b[K\rremote: Compressing objects:  89% (53/59)\u001b[K\rremote: Compressing objects:  91% (54/59)\u001b[K\rremote: Compressing objects:  93% (55/59)\u001b[K\rremote: Compressing objects:  94% (56/59)\u001b[K\rremote: Compressing objects:  96% (57/59)\u001b[K\rremote: Compressing objects:  98% (58/59)\u001b[K\rremote: Compressing objects: 100% (59/59)\u001b[K\rremote: Compressing objects: 100% (59/59), done.\u001b[K\n",
            "remote: Total 59 (delta 22), reused 0 (delta 0), pack-reused 0\u001b[K\n",
            "Unpacking objects: 100% (59/59), done.\n",
            "Cloning into 'tutorials-2016'...\n",
            "remote: Enumerating objects: 161, done.\u001b[K\n",
            "remote: Total 161 (delta 0), reused 0 (delta 0), pack-reused 161\u001b[K\n",
            "Receiving objects: 100% (161/161), 16.86 MiB | 25.85 MiB/s, done.\n",
            "Resolving deltas: 100% (64/64), done.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "rw0aebL3r2lS",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 124
        },
        "outputId": "691238bc-2bdc-4782-acda-0443339ede33"
      },
      "source": [
        "import os\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n",
            "\n",
            "Enter your authorization code:\n",
            "··········\n",
            "Mounted at /content/drive\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "K7PBrA4Yr8h_",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 407
        },
        "outputId": "86435abe-7721-4bb8-9c4f-bbe7fc170027"
      },
      "source": [
        "%matplotlib inline\n",
        "#%matplotlib inline 可以在Ipython编译器里直接使用，功能是可以内嵌绘图，并且可以省略掉plt.show()这一步。\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib.colors as colors\n",
        "from mpl_toolkits.axes_grid1 import make_axes_locatable\n",
        "from pandas import set_option\n",
        "set_option(\"display.max_rows\", 10)#设置要显示的默认行数，显示的最大行数是10\n",
        "pd.options.mode.chained_assignment = None #为了在增加列表行数的时候防止出现setting with copy warning\n",
        "filename = 'facies_vectors.csv'\n",
        "training_data = pd.read_csv('/content/tutorials-2016/1610_Facies_classification/training_data.csv')\n",
        "training_data"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Facies</th>\n",
              "      <th>Formation</th>\n",
              "      <th>Well Name</th>\n",
              "      <th>Depth</th>\n",
              "      <th>GR</th>\n",
              "      <th>ILD_log10</th>\n",
              "      <th>DeltaPHI</th>\n",
              "      <th>PHIND</th>\n",
              "      <th>PE</th>\n",
              "      <th>NM_M</th>\n",
              "      <th>RELPOS</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>3</td>\n",
              "      <td>A1 SH</td>\n",
              "      <td>SHRIMPLIN</td>\n",
              "      <td>2793.0</td>\n",
              "      <td>77.450</td>\n",
              "      <td>0.664</td>\n",
              "      <td>9.900</td>\n",
              "      <td>11.915</td>\n",
              "      <td>4.600</td>\n",
              "      <td>1</td>\n",
              "      <td>1.000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>3</td>\n",
              "      <td>A1 SH</td>\n",
              "      <td>SHRIMPLIN</td>\n",
              "      <td>2793.5</td>\n",
              "      <td>78.260</td>\n",
              "      <td>0.661</td>\n",
              "      <td>14.200</td>\n",
              "      <td>12.565</td>\n",
              "      <td>4.100</td>\n",
              "      <td>1</td>\n",
              "      <td>0.979</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>3</td>\n",
              "      <td>A1 SH</td>\n",
              "      <td>SHRIMPLIN</td>\n",
              "      <td>2794.0</td>\n",
              "      <td>79.050</td>\n",
              "      <td>0.658</td>\n",
              "      <td>14.800</td>\n",
              "      <td>13.050</td>\n",
              "      <td>3.600</td>\n",
              "      <td>1</td>\n",
              "      <td>0.957</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>3</td>\n",
              "      <td>A1 SH</td>\n",
              "      <td>SHRIMPLIN</td>\n",
              "      <td>2794.5</td>\n",
              "      <td>86.100</td>\n",
              "      <td>0.655</td>\n",
              "      <td>13.900</td>\n",
              "      <td>13.115</td>\n",
              "      <td>3.500</td>\n",
              "      <td>1</td>\n",
              "      <td>0.936</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>3</td>\n",
              "      <td>A1 SH</td>\n",
              "      <td>SHRIMPLIN</td>\n",
              "      <td>2795.0</td>\n",
              "      <td>74.580</td>\n",
              "      <td>0.647</td>\n",
              "      <td>13.500</td>\n",
              "      <td>13.300</td>\n",
              "      <td>3.400</td>\n",
              "      <td>1</td>\n",
              "      <td>0.915</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3227</th>\n",
              "      <td>5</td>\n",
              "      <td>C LM</td>\n",
              "      <td>CHURCHMAN BIBLE</td>\n",
              "      <td>3120.5</td>\n",
              "      <td>46.719</td>\n",
              "      <td>0.947</td>\n",
              "      <td>1.828</td>\n",
              "      <td>7.254</td>\n",
              "      <td>3.617</td>\n",
              "      <td>2</td>\n",
              "      <td>0.685</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3228</th>\n",
              "      <td>5</td>\n",
              "      <td>C LM</td>\n",
              "      <td>CHURCHMAN BIBLE</td>\n",
              "      <td>3121.0</td>\n",
              "      <td>44.563</td>\n",
              "      <td>0.953</td>\n",
              "      <td>2.241</td>\n",
              "      <td>8.013</td>\n",
              "      <td>3.344</td>\n",
              "      <td>2</td>\n",
              "      <td>0.677</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3229</th>\n",
              "      <td>5</td>\n",
              "      <td>C LM</td>\n",
              "      <td>CHURCHMAN BIBLE</td>\n",
              "      <td>3121.5</td>\n",
              "      <td>49.719</td>\n",
              "      <td>0.964</td>\n",
              "      <td>2.925</td>\n",
              "      <td>8.013</td>\n",
              "      <td>3.190</td>\n",
              "      <td>2</td>\n",
              "      <td>0.669</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3230</th>\n",
              "      <td>5</td>\n",
              "      <td>C LM</td>\n",
              "      <td>CHURCHMAN BIBLE</td>\n",
              "      <td>3122.0</td>\n",
              "      <td>51.469</td>\n",
              "      <td>0.965</td>\n",
              "      <td>3.083</td>\n",
              "      <td>7.708</td>\n",
              "      <td>3.152</td>\n",
              "      <td>2</td>\n",
              "      <td>0.661</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3231</th>\n",
              "      <td>5</td>\n",
              "      <td>C LM</td>\n",
              "      <td>CHURCHMAN BIBLE</td>\n",
              "      <td>3122.5</td>\n",
              "      <td>50.031</td>\n",
              "      <td>0.970</td>\n",
              "      <td>2.609</td>\n",
              "      <td>6.668</td>\n",
              "      <td>3.295</td>\n",
              "      <td>2</td>\n",
              "      <td>0.653</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>3232 rows × 11 columns</p>\n",
              "</div>"
            ],
            "text/plain": [
              "      Facies Formation        Well Name   Depth  ...   PHIND     PE  NM_M  RELPOS\n",
              "0          3     A1 SH        SHRIMPLIN  2793.0  ...  11.915  4.600     1   1.000\n",
              "1          3     A1 SH        SHRIMPLIN  2793.5  ...  12.565  4.100     1   0.979\n",
              "2          3     A1 SH        SHRIMPLIN  2794.0  ...  13.050  3.600     1   0.957\n",
              "3          3     A1 SH        SHRIMPLIN  2794.5  ...  13.115  3.500     1   0.936\n",
              "4          3     A1 SH        SHRIMPLIN  2795.0  ...  13.300  3.400     1   0.915\n",
              "...      ...       ...              ...     ...  ...     ...    ...   ...     ...\n",
              "3227       5      C LM  CHURCHMAN BIBLE  3120.5  ...   7.254  3.617     2   0.685\n",
              "3228       5      C LM  CHURCHMAN BIBLE  3121.0  ...   8.013  3.344     2   0.677\n",
              "3229       5      C LM  CHURCHMAN BIBLE  3121.5  ...   8.013  3.190     2   0.669\n",
              "3230       5      C LM  CHURCHMAN BIBLE  3122.0  ...   7.708  3.152     2   0.661\n",
              "3231       5      C LM  CHURCHMAN BIBLE  3122.5  ...   6.668  3.295     2   0.653\n",
              "\n",
              "[3232 rows x 11 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 5
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OXLr943cr_Zz",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 69
        },
        "outputId": "b6d100e6-a8fd-48ed-fb52-7f8e00e2a0d6"
      },
      "source": [
        "training_data['Well Name'] = training_data['Well Name'].astype('category')\n",
        "training_data['Formation'] = training_data['Formation'].astype('category')\n",
        "training_data['Well Name'].unique()"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[SHRIMPLIN, SHANKLE, LUKE G U, CROSS H CATTLE, NOLAN, Recruit F9, NEWBY, CHURCHMAN BIBLE]\n",
              "Categories (8, object): [SHRIMPLIN, SHANKLE, LUKE G U, CROSS H CATTLE, NOLAN, Recruit F9, NEWBY,\n",
              "                         CHURCHMAN BIBLE]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 6
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XgXfk6c-sD-f",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 288
        },
        "outputId": "4d4674e8-014f-4f1e-a030-95dae4f631b6"
      },
      "source": [
        "# 1=sandstone  2=c_siltstone   3=f_siltstone \n",
        "# 4=marine_silt_shale 5=mudstone 6=wackestone 7=dolomite\n",
        "# 8=packstone 9=bafflestone\n",
        "facies_colors = ['#F4D03F', '#F5B041','#DC7633','#6E2C00',\n",
        "       '#1B4F72','#2E86C1', '#AED6F1', '#A569BD', '#196F3D']\n",
        "\n",
        "facies_labels = ['SS', 'CSiS', 'FSiS', 'SiSh', 'MS',\n",
        "                 'WS', 'D','PS', 'BS']\n",
        "#facies_color_map is a dictionary that maps facies labels\n",
        "#to their respective colors\n",
        "facies_color_map = {}\n",
        "for ind, label in enumerate(facies_labels):\n",
        "    facies_color_map[label] = facies_colors[ind]\n",
        "\n",
        "def label_facies(row, labels):\n",
        "    return labels[ row['Facies'] -1]\n",
        "    \n",
        "training_data.loc[:,'FaciesLabels'] = training_data.apply(lambda row: label_facies(row, facies_labels), axis=1) #建立标签\n",
        "training_data.describe()"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Facies</th>\n",
              "      <th>Depth</th>\n",
              "      <th>GR</th>\n",
              "      <th>ILD_log10</th>\n",
              "      <th>DeltaPHI</th>\n",
              "      <th>PHIND</th>\n",
              "      <th>PE</th>\n",
              "      <th>NM_M</th>\n",
              "      <th>RELPOS</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>count</th>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>mean</th>\n",
              "      <td>4.422030</td>\n",
              "      <td>2875.824567</td>\n",
              "      <td>66.135769</td>\n",
              "      <td>0.642719</td>\n",
              "      <td>3.559642</td>\n",
              "      <td>13.483213</td>\n",
              "      <td>3.725014</td>\n",
              "      <td>1.498453</td>\n",
              "      <td>0.520287</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>std</th>\n",
              "      <td>2.504243</td>\n",
              "      <td>131.006274</td>\n",
              "      <td>30.854826</td>\n",
              "      <td>0.241845</td>\n",
              "      <td>5.228948</td>\n",
              "      <td>7.698980</td>\n",
              "      <td>0.896152</td>\n",
              "      <td>0.500075</td>\n",
              "      <td>0.286792</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>min</th>\n",
              "      <td>1.000000</td>\n",
              "      <td>2573.500000</td>\n",
              "      <td>13.250000</td>\n",
              "      <td>-0.025949</td>\n",
              "      <td>-21.832000</td>\n",
              "      <td>0.550000</td>\n",
              "      <td>0.200000</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.010000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25%</th>\n",
              "      <td>2.000000</td>\n",
              "      <td>2791.000000</td>\n",
              "      <td>46.918750</td>\n",
              "      <td>0.492750</td>\n",
              "      <td>1.163750</td>\n",
              "      <td>8.346750</td>\n",
              "      <td>3.100000</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.273000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>50%</th>\n",
              "      <td>4.000000</td>\n",
              "      <td>2893.500000</td>\n",
              "      <td>65.721500</td>\n",
              "      <td>0.624437</td>\n",
              "      <td>3.500000</td>\n",
              "      <td>12.150000</td>\n",
              "      <td>3.551500</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.526000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>75%</th>\n",
              "      <td>6.000000</td>\n",
              "      <td>2980.000000</td>\n",
              "      <td>79.626250</td>\n",
              "      <td>0.812735</td>\n",
              "      <td>6.432500</td>\n",
              "      <td>16.453750</td>\n",
              "      <td>4.300000</td>\n",
              "      <td>2.000000</td>\n",
              "      <td>0.767250</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>max</th>\n",
              "      <td>9.000000</td>\n",
              "      <td>3122.500000</td>\n",
              "      <td>361.150000</td>\n",
              "      <td>1.480000</td>\n",
              "      <td>18.600000</td>\n",
              "      <td>84.400000</td>\n",
              "      <td>8.094000</td>\n",
              "      <td>2.000000</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "            Facies        Depth  ...         NM_M       RELPOS\n",
              "count  3232.000000  3232.000000  ...  3232.000000  3232.000000\n",
              "mean      4.422030  2875.824567  ...     1.498453     0.520287\n",
              "std       2.504243   131.006274  ...     0.500075     0.286792\n",
              "min       1.000000  2573.500000  ...     1.000000     0.010000\n",
              "25%       2.000000  2791.000000  ...     1.000000     0.273000\n",
              "50%       4.000000  2893.500000  ...     1.000000     0.526000\n",
              "75%       6.000000  2980.000000  ...     2.000000     0.767250\n",
              "max       9.000000  3122.500000  ...     2.000000     1.000000\n",
              "\n",
              "[8 rows x 9 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 7
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "xYclPvD4uVfk",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 466
        },
        "outputId": "face3b3e-5bfe-4b0f-cc61-e8d11fb1349f"
      },
      "source": [
        "#count the number of unique entries for each facies, sort them by facies number (instead of by number of entries)\n",
        "#计算每个相的唯一条目数，然后按相数（而不是条目数）对它们进行排序\n",
        "facies_counts = training_data['Facies'].value_counts().sort_index()\n",
        "#use facies labels to index each count\n",
        "#使用相标签索引每个计数\n",
        "facies_counts.index = facies_labels\n",
        "\n",
        "facies_counts.plot(kind='bar',color=facies_colors, \n",
        "                   title='Distribution of Training Data by Facies')\n",
        "facies_counts"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "SS      259\n",
              "CSiS    738\n",
              "FSiS    615\n",
              "SiSh    184\n",
              "MS      217\n",
              "WS      462\n",
              "D        98\n",
              "PS      498\n",
              "BS      161\n",
              "Name: Facies, dtype: int64"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 8
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "QtWLNJ9huaPn",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 288
        },
        "outputId": "2349f476-bf8c-403c-aa2a-60f4dacbf53e"
      },
      "source": [
        "correct_facies_labels = training_data['Facies'].values\n",
        "\n",
        "feature_vectors = training_data.drop(['Formation', 'Well Name', 'Depth','Facies','FaciesLabels'], axis=1)\n",
        "feature_vectors.describe()"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "<div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>GR</th>\n",
              "      <th>ILD_log10</th>\n",
              "      <th>DeltaPHI</th>\n",
              "      <th>PHIND</th>\n",
              "      <th>PE</th>\n",
              "      <th>NM_M</th>\n",
              "      <th>RELPOS</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>count</th>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "      <td>3232.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>mean</th>\n",
              "      <td>66.135769</td>\n",
              "      <td>0.642719</td>\n",
              "      <td>3.559642</td>\n",
              "      <td>13.483213</td>\n",
              "      <td>3.725014</td>\n",
              "      <td>1.498453</td>\n",
              "      <td>0.520287</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>std</th>\n",
              "      <td>30.854826</td>\n",
              "      <td>0.241845</td>\n",
              "      <td>5.228948</td>\n",
              "      <td>7.698980</td>\n",
              "      <td>0.896152</td>\n",
              "      <td>0.500075</td>\n",
              "      <td>0.286792</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>min</th>\n",
              "      <td>13.250000</td>\n",
              "      <td>-0.025949</td>\n",
              "      <td>-21.832000</td>\n",
              "      <td>0.550000</td>\n",
              "      <td>0.200000</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.010000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>25%</th>\n",
              "      <td>46.918750</td>\n",
              "      <td>0.492750</td>\n",
              "      <td>1.163750</td>\n",
              "      <td>8.346750</td>\n",
              "      <td>3.100000</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.273000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>50%</th>\n",
              "      <td>65.721500</td>\n",
              "      <td>0.624437</td>\n",
              "      <td>3.500000</td>\n",
              "      <td>12.150000</td>\n",
              "      <td>3.551500</td>\n",
              "      <td>1.000000</td>\n",
              "      <td>0.526000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>75%</th>\n",
              "      <td>79.626250</td>\n",
              "      <td>0.812735</td>\n",
              "      <td>6.432500</td>\n",
              "      <td>16.453750</td>\n",
              "      <td>4.300000</td>\n",
              "      <td>2.000000</td>\n",
              "      <td>0.767250</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>max</th>\n",
              "      <td>361.150000</td>\n",
              "      <td>1.480000</td>\n",
              "      <td>18.600000</td>\n",
              "      <td>84.400000</td>\n",
              "      <td>8.094000</td>\n",
              "      <td>2.000000</td>\n",
              "      <td>1.000000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>"
            ],
            "text/plain": [
              "                GR    ILD_log10  ...         NM_M       RELPOS\n",
              "count  3232.000000  3232.000000  ...  3232.000000  3232.000000\n",
              "mean     66.135769     0.642719  ...     1.498453     0.520287\n",
              "std      30.854826     0.241845  ...     0.500075     0.286792\n",
              "min      13.250000    -0.025949  ...     1.000000     0.010000\n",
              "25%      46.918750     0.492750  ...     1.000000     0.273000\n",
              "50%      65.721500     0.624437  ...     1.000000     0.526000\n",
              "75%      79.626250     0.812735  ...     2.000000     0.767250\n",
              "max     361.150000     1.480000  ...     2.000000     1.000000\n",
              "\n",
              "[8 rows x 7 columns]"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 9
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "gUk5YDFOueJG",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn import preprocessing\n",
        "\n",
        "scaler = preprocessing.StandardScaler().fit(feature_vectors)\n",
        "scaled_features = scaler.transform(feature_vectors)"
      ],
      "execution_count": 10,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "-YpX8bElsI7K",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(\n",
        "        scaled_features, correct_facies_labels, test_size=0.2, random_state=42)"
      ],
      "execution_count": 11,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NZtG8GLTsKNc",
        "colab_type": "text"
      },
      "source": [
        "#PCA降维"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "harMDRTgsU4N",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 281
        },
        "outputId": "a7e4d173-9215-4d89-d0d2-2b9b7cd6cf1a"
      },
      "source": [
        "import numpy as np\n",
        "from sklearn.datasets import load_iris\n",
        "from sklearn.decomposition import PCA\n",
        "import matplotlib.pyplot as plt\n",
        "X = scaled_features\n",
        "Y = correct_facies_labels\n",
        "sklearn_pca = PCA(n_components=6)#降维\n",
        "data_2d2 = sklearn_pca.fit_transform(X)\n",
        "plt.subplot(122)\n",
        "plt.title(\"sklearn_PCA\")\n",
        "plt.scatter(data_2d2[:, 0], data_2d2[:, 1], c = Y)\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAALwAAAEICAYAAADlZZ58AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOydd3xV9f3/n58z7sweJKwQZMhShoAbcW+lrlpHtdra9etu7bTDr22tHVqtbbVarXtvqFsRQUEQZMheISGBzJvcfcbn98e5Se7NvQmhBEPgvh6PPCBnfM7nnLzO57z3W0gpySKLQwVKf08giyw+S2QJn8UhhSzhszikkCV8FocUsoTP4pBClvBZHFLIEj6LQwpZwu8FhBC/FkI8srf7sjhwkCX8QQwhxDYhREQIERRC7BJCPCiEyEnaf6YQ4j0hRJsQol4IMV8IcUGXMWYLIaQQ4sef/R30PbKEP8AhhND2cYjzpZQ5wDRgOvCLxLiXAE8DDwHDgDLgl8D5Xc6/BmgCvriP8zggkCV8NxBC/FgIUZNY/dYLIU7tsl8XQjwuhHhWCOHKcP4xQohFQogWIcQnQojZSfu+JIRYmxh7ixDiq0n7ZgshqhPXrwMeSIhLTwkhHkqcs0YIMX1v7kdKWQP8F5gkhBDAX4D/k1LeJ6UMSCltKeV8KeVXkubiBy4BvgmM2dtrHojIEj4DhBCHA/8PmCGlzAXOBLYl7fcCLwAx4DIpZbzL+UOBucAtQBHwQ+BZIURp4pDdwHlAHvAl4HYhxLSkIcoT540AbkhsuwB4AigAXgL+tpf3NBw4B1gOHA4MB57Zw2kXAUGcL8FrOKv9gEaW8JlhAW5gghBCl1Juk1JuTuzLA14FNgNfklJaGc6/CpgnpZyXWDnfAJbiEA4p5Vwp5WbpYD7wOnBi0vk28CspZUxKGUlsez8xngU8DEzu5b28IIRoAd4H5gO/A4oT+2r3cO41wJOJaz4GXC6E0Ht53QMSWcJngJRyE/Bd4NfAbiHEE0KIIYndxwBHArfK7kNNRwCXJsSZlgThTgAGAwghzhZCfCiEaErsOwcoSTq/XkoZ7TJmXdL/w4Cnl/L9HCllgZRyhJTyG4kXqDGxb3B3JyW+CCcDjyY2vQh4gHN7cc0DFlnCdwMp5WNSyhNwyCuBPyR2vQ78HnhLCFHWzek7gIcTRGv/8UspbxVCuIFngT8BZVLKAmAeIJIvvz/uKQnrE3O8uIdjrsbhx8sJXWILDuEHtFiTJXwGCCEOF0KckiBnFIjgiBkASClvw/nEvyWEKMkwxCPA+QmznyqE8CSU0WGAC0dcqgdMIcTZwBn7+56SkfgyfR+4KaFA5wkhFCHECUKIexOHXQP8BpiS9HMxcI4QojjjwAMAWcJnhhu4FWjAESUGAT9NPkBK+X84iuubQoiiLvt2ABcCP8Mh9g7gR4AipWwDvg08BTQDV+AooZ8ppJTPAJ8HrgN2ArtwlOwXhRDH4HzZ7pZS1iX9vARsAr7wWc+3ryCyGU9ZHErIrvBZHFLYVy9eFv0IIUQF8Gk3uydIKas+y/kMBGRFmiwOKfTLCl9SUiIrKyv749JZHAJYtmxZg5SyNNO+fiF8ZWUlS5cu7Y9LZ3EIQAixvbt9WaU1i0MKWcJncUghS/gsDilkCZ/FIYWsHT6LAwaWZbNh6y5sGw4fVYam9v16nCV8FgcEVq/fyc/+8ALRmAGArmvc8qMLmDpxeJ9eJyvSZNHvCIZifP/mZ2gKhAlHDcJRg0BbhBt/9xwtreE+vVaW8Fn0O979cAOZPP62LXnr/XV9eq0+IbwQokAI8YwQYl0iOfnYvhg3i0MDgbYIcTM9UzIeN2lpjWQ4439HX8nwfwVelVJeksjg9/XRuActpLTZGHiEzYHHMewgpZ7pHFH8XXJcI/p7ap85pk4cjq4pWJadst3j1pl2REWfXmufV3ghRD4wC7gfQEoZl1K27Ou4BzuW1/+WtU3/IGLWYdpBasPv8U7N1UTM3f09tc8c40eXc8y0w/C4O9dfj1tnysRhTJkwrE+v1Rcr/EicrJ4HhBCTgWXAd6SUoeSDhBA3kCg5UVHRt2/tQEPUbKAq+Ap2SnUPG8uOsqnlUY4o+V6/za0/IITgN987jzcWrOWVt1chJZxz8kTOPGkiTgmdvkNfEF7DqWr1LSnlYiHEX4GfADclHySlvBe4F2D69OmHdExya3wzqnB1ITzYGDRGP+mnWfUvVFXhrNkTOWv2xP16nb5QWquBainl4sTvz+C8AFl0A78+FEsaadsFKrmukf0wo0MH+0x4KWUdsCNRrQvgVLrPwskC8OvDKPEchdKlQp8idMYUXN1Pszo00Fd2+G8BjwohVuKUc/hdH4170OKY8j8x1H8GCi4EGjl6BccNvos812H9PbXPHFLKjHb4/YF+SfGbPn26zCaAOLBkHNuOoSk5fa6gHehoaA7y53vfZNGyLQCcMH0U3//KaRQX+vdpXCHEMillxsKv2ViafoYqXKhqWvHhgx5xw+SrP3mUhqYglu0suu8v3cT6Lbt44m/Xo2nqfrluNrQgi37BgiWbaA3GOsgOYFmS1mCEhUs393DmviFL+Cz6BdtrmohE42nbo1GTbdVN++26WcJn0S8YObwYrye98rbHrTFy+P4rXZklfBb9ghOmj6Ywz4ealOShqgqFBX6Omz5qv103q7Rm0Sus21zHg099wJYdDRxWUcqXLjuWww/rrlr4nqHrKvfcegV//fc7vLd4I0IIZh09mm9/6ZT9kunUjqxZMosesb26kaWrqvj7Q/OJGyZSghDgdmn8+ReXMLmPg7v6AlmzZBZ7jd2Nbdz4u+eorm0mFneI3g4pIRozuePfb/PAnwZWc78s4Q8RSClZvX4nC5Zswu3WOP3E8VQMKer22B/e8izbqxtTzIZdsXlb/f6a7n5DlvCHAKSU/OEfr/Pm+2uJxUwUVeGxFz7i29edzIWnp/dG21LVwM5dLT2SHSA3x7O/przfkLXSHAJYunI7r767hmjMROKUw4jFTf56/9sZk6RbWiMp1pNM8Lg1Pn/BUftpxvsPWcIfRKivbuSNh+ez6MWPiMc6w4/vfOAdzC7pcwCKIli8fFva9nGjyjDM9OMBdE3F5dK44PTJXDXn6D6b+2eFrEjTj5BSsiv8PtvbXkZiU5F7LoN9JyHE3q9D//n1kzx524uomooiBIqqcOtrv2DIhGFsr27MeI5h2MTiBo88v4QtVfWMH13O2bMnkeN385XLj+f+JxcSjZkAuHSVonw/v/7+eRxWUYLPOzDjf7JmyX7E8t2/pSo4FyvRe1gVXgb7TmJG2e/2KnJyxTuruen8W4mGYynb80vy+L/3/49v/fqpDuJ2haYqCAGGaeNxa3jcOvfddjXlpXl89Ml2npq7jOZAmBNnjOLis6eR43f/7zf8GSFrljwAEYhtpCr4MpbsJKklI9SG36UptpJiT28bbcPcf72ZRnYAI27QtLEWuwflM1nUicZM4nGLux54h19971yOHDeEGZMPrioKWcL3E3ZHPkDKdDnZkjF2hRbtFeGjwa5NuzuhCcFZsyfy2vxPicUzr/LJsKXkvSUbOf3KO5G2JN+tM33oIC667GiOmL536YctTSGe+Ne7fDh/Hf5cD5+78jhOPX9Kv8b9Z5XWfoKT8JG+3ijo6GrOXo118uXH4/G7ceVZHH5xK5OuaiGvwsA0LGRpHm6XxrhR5XjdTrDWnvgmpWPJsaWkORLjjQ1V/PybD/Gfu97o9ZyCrRG+edndvPLUEuqqm9m8tpa7fvsS9/zxv3t1b32NLOH7CUP9p2XcLoRgWM6ZezXWSZcdxzHX5fPF97dxwk31HPvjRj4/t4rZ93m56fa5PDPvY9Zs2IktJZeeNw2vZy8UTiFACEK64NmHFlLXy9Ddec98RDAQxjQ6K4rFIgZzn1pCY33bXt1fXyJL+H6CS83j2PK/oAl/0o+PGWW34tUG9XqcD5Zt4Zof/otRX12C7pW4/BLN4/xUTFlB4eAapHRk9Vjc5MXXV0I3hgpVEWRc/BWB7VIQQrDsg029mtfyDzcTy6Ao6y6VTZ/W9Pr++hpZGb4fMch3DOeOfJuGyFKktCn1TkdVeu+9XLaqil/86SWGj9makcOqZjHhqC3s3Nb5AmmqwhUXzuDRF5YghMN9w7Q4/qhRzJg8grsfmk8k2qWEiC1RYhaKIvD6evd1KB9WhKJuxe5i/7ctm5Ky/F7fY18jS/h+hipclPmO6/XxawKf8kz1c9RG64g2aChDCxCKDRnWZgGoqp22rajAz9jDBrFybQ0CwbHTRnLj188gL8fDK2+tYtP2esx2x5MtEaaNFjSQHhfHzB7fq3leeMUxvP3KCmJJhFdVhSEVxRx2eHmv77evkRVpBhBWtqzijo13sSW0lYgVQRa2Uf65aurtHBQ13eJjGhrrVlSmbJNI/vHIfFau3YmUjlXmw+XbuO5HDxFoi3Dnbz7P586cgtetI2yJJ2JR3BTH73Pzm7uuwtdLO3zl6DJ+9sfPU1Dkx+PV0V0aE6ZW8Nt/XtuvVpqs42kA4acrf8HOaG3adqNZx/eRwukXL0EoNqoi0VQPwV1HcP9fxyOEQFEckp09eyLz3lmd0RGlqQrXff44vnjxMQCE2qKsWLIFTVeZevRhuNzpKXl7gmXZ1FU34fW7KSrJ3evz/xdkHU8HCeqiuzJu1woM1i0fR+32UiZNr2LqkYOYPeULFI2czOyRAZas2IbHozNz8gjue2Jht15X07J56NnFjB9dzozJlfhzPRx/6oR9mrOqKgwdUbJPY/QlsoQfQMjX82k2mtN3xHQURUGzy5lZMYeLjul07gwtL0DXVf7+0HxubYugqSqqIroN/Y3GDJ6Zt5wZkyv34530H7IyfAYEYpuoCb5JW3xrn45rS8n7Vdt5dNUnLKut2evycnOGno9LSbWS2IZC48IiCvN8fO2qE7n47KkpMvIbC9Zy+31v0RwIY9mSmGHuMc69Ndi3XTcOJPTZCi+EUIGlQI2U8ry+GvezhGmHWVT7bZpjaxCoSExKvTM4uvzPqGLfogMbw2E+/+wT7AoGsaREEYJxJaX8auosHn/uIzZuradyWBHXXnocE8cOzjjGSaWziNlxXqh5iYgZxYpD86JiAksLgRB/+teb+LwuTjpmbMc59z+5sFchBe1QFIHP42Lz9npGjSjdp3s+ENFnSqsQ4vvAdCBvT4Q/UJXWZbt/w462edh0FghShJtReZ/f5yYFX33lBd7ZthXT7rSm6IqCt9omd5PssKO7XRq3/mROjyKFaVmc/7U7aWs2QaZaPCqHFfHIX6/r+P3ky2/HMNL7J/UEIcCla1x67jS+dtWsvTr3QEBPSmtfNTUbBpwL3NcX4/UHpJTsCKaSHcCWMba1vbBPY8ctK43sAIZt01YqU5xGsbjJ7fe91fN4cYtwQKaRHaAuyW0fjxloZuYFzed14dJV3Loj0ydDSmceT8/9mHWb6/Z0ewMKfSXS3AHcCHw2dqf9AImFnaFJAYAlu49G7NXYPZWDzmCS3rGzGdO0ui0o6vXo5OV4aA6kp+eVleQgpUQIwWvPL0PbHYZiNySTWkq+e93JzJhcyUefbGf1hp0ZoynjhsnbC9czblT/OYr6Gn3R1Ow8YLeUctkejrtBCLFUCLG0vv7Ay3ZXhEahe1KGPYJS78x9GtutaUwpH5zObQmeDMlIXq+rx5xSIQQ3XHECblf6elW7u5U//vN1pJS8M28lsiWKpzaEEjUdr2ncIq85TmVxPqXFuZxzyiQmjB6c0RmUbL8/WNAXIs3xwAVCiG3AE8ApQohHuh4kpbxXSjldSjm9tPTAVIamlf4CTfhRcBwsCi50JZfJxT/c57FvPfUM8twevJpDUp+uk6+5KK1OXcXdLo1Lzpm6R2/k+acdyXeuOzlte9yweH3BOlZ8Wo07UbtRC5v4dgTJ2RzAv70NPWTiTnIiHT9jFLad7qnVNZVTTxjX8fuSFdu4/saHOeOqO7nuhw/x4fK+tWJ9FthnkUZK+VPgpwBCiNnAD6WUV+3ruP2BfPdYTq94ji2BpwjEN1DonsTIvEvwaJnrt+wNRhUVM//a63lu7adsbGrkyLJyzh9zOA/lf8jTcz/GQmKYFk0lJs9am5i0YwTHDe+526FL1/B69LRgr1jc4K2F6zjtgqks/zC99LRl2QwaVsD9TyzkrUXrEcDkCUNZsaYaRVGwbYlQBFdfdDRjKgdhWTZPz/uYex5d0KEAb9i6m5/f9iK/+u65zDp6zD4/n88KWcdTF3i1QUws/n/7Zew8t4drp6T2e/vaVbNoHGrxxEefENZAaoJAcxNffvl5HrvoMqaUZzZRAj02DdA1lWBrGFVNb/hrmBZzrrgL06N17Nte04QQcOSYwZw4cwwnzBjFsMGFrNlQy0//8ALNgVBaRGYsbnL3Q/MHFOH71PEkpXx3oNrg+wsRw+DRtSsJeSyk1inGRE2TOz5c1OO5mqo4q7uUKTHuLl3jzFkT2PhpbRrZ22GFjbR9UsLaTXXk+N0MG1xIOBLnezc/TVNLOtnbUVPX8pn1Z+oLZD2t/Yy6YFu3CRkbmhq6PW/nrhZu+cvLeHYG8W8K4N8UwF0bAsvmyjkzGTe6nJFjyzrk+K6wXZm/DnHD4um5y2gOhPjVX17O2LQgGYX5vgHVmypL+H6EbUvuvf89YvHMjqGcZpMfnvJrbv/qPWz/dEfKvuf/uwJ1cwtqyETgWDe1oIG/OsTEsY4Z8Yw5R+Fyayk5rBKwXQq2p3txKNAa4ZrvP8TiFdu6XdnBaQ9/7aXH9vJuDwxkCd+PWLh0Mx8t346vRiKsVGYJw8a8dzmfvLuGV//9Nt+c+VM+em1Fx/61S7eCJVNMnQLAtFm2yFFUc/O83P7wVxk3uQKJQ3YzRycyNKfHTO5AW4TWYKTH8h5et871nz+Oi86asvc3vhcItkb42y0vcekJv+XSE3/L3b97mVDb/+4XySqt/Yg3FqwlGjXI2wqKAaHhElsHV0Ockqe3oG4MAE5aXCwc47Zr7+apnfcihCBP0xGZ+GhLPEnbh1WWcPtDN3Dz7a/w2sK1iCTvrMRx1gpIGcu07G5Xdl1TOHLcUP580yX7rdNeOyzT4ntfvJfaHU0dyeD/fWYp7722imNOHs/Rsw7n6JPG7bEOZjKyhO9H6LpDGAHkVjs/AO7/rkbpmlcKtOwO8PQ9b3PZ105l1knj+Xj+eujyZdB0lSMSxZMWz1/Hs48sojoQZFBlMZESgacZhAXxXGgdBVJziF/2UecYPYkxR44bys++dfZ+JzvAkgUbaKgLpFQ+ME2LQHOY155bxvxXVzF2wlB+d8+1aHrv5pMVafoIjbEQj2xezN/XzWd5445eWS7OPXkSHneGNUfvfh16+J53CbVFOenMI8jP93Vsl4rAztEpGlbIyIlD+NUvn+am3zzLovoGqowYSzftxNsIphfqjofGqQIjT2D6BEqXYEpdV7r1sC5fs4Orv/sgG7fu3uP97Su2rK8lEuleaY6G46xfU83bc1d0e0xXZFf4PsDCXZv55gdPIpGY0uS+DQuZXT6WP824GKUHWdnnc1FanEv1zmaEblN4Yj25k1oQ39WJLoTWO6LYu5NeHL8P3ePiuYcXMu+Zj4iEYgghsFRBZJgf1a2xQ1h87iv/RNoSChIhzYk5CBv0NvBXQXBkQua3oWCLwFnn29vZ6KiKIJBBVrYlhCNxbv3Ha9x/29V99AQzY/DwIjxeF9Fw96SPRQzeeuUTzpjTu9Ld2RV+H/FhdRXXPvc8rVUu2qrcxBrdhA2Dd+s28MbOtd2et2jZZr75iyeorm1GAuWXVJE3pRnVa6O4wXuSTumDfkSu4rDQ60EZNhjbtnnq3+/R3BAkHjOdQDHTxrMzhGnZmJZ0qKuIjiJKyRBATjX4bBVfs6B8paDIdKGqAl1TGF1Zyt9vuTxjee1kbNy6m2gsc7BdX+H4Uyfi9br2GM/j9fY+1zZL+H3AtpZmvvTic1hGu2FQYIc1jAYPEcvg+e2ZP7VSSv54zxsdvZPc5RHc5VEUvXM1FyoIn4L/imKUUSNQR41AaCqWJbG7WnQAxbDT5PnuoNhQsMAkf6WNCNgEw3G8HhcP/vkaHvjTNRxWUbrHCElFEajK/qWP26Nz+yNfZdJRld0qph6vztmX9j6475AgvJQSGXkFu/Ey7PqzsdtuR9qt+zzuAys+TotxB4GMq9iG6NYh09IapqmlM7TXVZpe+RdA8YA+TsFXlIvP7yYnz8voCUMye08FjrzRC0hI0UyllMQNk3c/3NCx7ZtfPCmzfgFomsKJM0Z3KN37E+VDC7nt/ut57oOb+MvDN5CT58Xnd+P26rhcGmdfPIOZJ47d80AJHBIyvGz7HYSfAhK5mqH7kdFXoPglhOL/n8dd21CF1Y1y6rJ1LhqR2Ua9u6EthbRGU+b0QRWNS885leLRI/H5PUw7bjQvPf4hW9bVEkurDgZ6IIbl1VGjZqI8norl1zLY3CV6YxQtbBIt9yFdKvG4xdpNnckeYw8r457fX8m/Hn+fJSu2YZgWuqaiKAojhhbxo6+dsecH1Idwe3QmTK7gsbd/zNL3N9AWiHDkjJEMHrZ3gX0HPeHt6LsQfgRI9mbGwapHRp5H+PcusFNKGykly+p/Rb6vDlUZi2Wnr3QnDx/NaYPHZRgBXnlrdcrv0RovRrMLvTiGkvQXcasuzqo8jdwxnXk1Z180nRcf+YBmK5hirgPQ2wzMPDeGz0N7Q1U1ZOCqC2MUeTAL3UghkAL05hgC8FYHCVfmobu1tBzWUSNKufUnnwNgS1U9m7Y3MKy8gPGjy/stnMDl0jjulP+9dMhBS3gp48jmr0N8Malkb0cUgncgPaci1O4jEtsRNutYXv9bdocXkVALOX6Eh0XbDyNqC2RCOtQUhRNHVHDn8Rd3O1ZdfVdxSrDz8REMOquO3MODSCEZnTOK60ZeQ67eSfaG5iBPvrQUdWIJRbUejIYwtmkTbA1jWZJomQ/pSii5CR+s5dMxC9y4G6OoYYPI8FykjHbKsrZECxq4/G4+18VrGgzFWLa6Ck1VmH5EBYdVHJh5DHuDg5fwoQcg/hHQQ/CTbEU2XQUlb/TYV8m0I7xTfTUxq5F28x1AnifCd47/L6+sncbGhsF4NJMrj5zAd4+e0+Pcjp5ayfI1VSkFkeyYSuO8Cv5+7vUUFfrQlNQ/ze7GNr70g/8QjsQxTNtJtC5zU94Qx7IkUoDlyyC+KAIz34W7OYYWsQiMNBj6VpLOIKE8388vf3UZ4MTKq6rC6+99yq1/f61D1FdVwa0/+RzTjxzYHUEOWsITeRroRcyF3eS8GO7uO9LVBN/AtEMkk70dJf4g105/DwBN+Dl28Floe7BenHPyJJ6e+zH1jW2YwRh6cwzVlIyZNBRNijSyAzzw5CKCoVhHTRkpIRYzaWxL6CU9iBgyaV/Z+1EcW4WjQwhFMHJcOd/65RNI6eTLXjFnBvc+tgAryepjmPCD/3uGuQ/+vwHR56k7HLxWGtn7WizYmTPzTTvCmsa7WFH/h47GYz1BCNGrVjU+r4v7b7uaUyZV4qsOobcZKBGTqhXVfPVzd7JrZ3p1sQUfbcpYQMkq9ODyOIVPRTyD9UZKtFCSgquphEfkYrlU56ugK3y4oZpY3CRumATaItzz6HspZO+4li154uUDr7zK3uDgJbz3HKAXxZOkCXo6SaW0WbDzK2wMPIJFenWArlCFh5llt6GI3jlB/D4Xa9/dkGJKNAyLUFuUh+5OLdPx/KvLCbRlfuEMv8bpc6ahuzTyAlGw7c4xbScK09XY+aUz8l0gIDbIg1HgJjIsB6MLuTOkt3Zg5brqXt3fgYqDlvDC/3VQhwPt8SZuElHjSUd5wXMWQqtMO393ZDFt8a3YsucECACBxhnDX6LM1/vY8MbdbbQF0kls25KPF3V22YjFDP7+8HvdBnTZEmZ9biq3P/F1Tvj6aq798UsMyq1HbY2jN0TwbmtFJLyv0SIX0u3I+bZHI17iTS3f0RNsid4cZdei7fziG/9h8fx1AyrTqR0HrQwvlFwoeRGiryPjyxzye06D8ONYkecQMoxAIoz1yOjrCE+qXbkl9immzOwQ6gpFuAia2/HqvbdieP2ubgmTm++lpTXMXQ++yzuLNhA3uhfPbCn54S3PghLhKz/fgqbb5BeGCK50IdpX6kSojDtgENNiWPlu501RRUd3j/a2Nhl1ASnxVgdR4hYBGWVpXSurl23j/MuP4frv7V0/qv7GQbvCAwjhQnjPQ8n/FUrOdYRsi/eb5yHtZoSMIYiCtQ7Z8kPs0GMp5/q0IWiid8qZlDaWvXcFSP05HmaeeHiat9Lt0Zlz1XF8/WeP89b763okezsiUQOPP4xtKexcXUTt/AIUu7PGk5Bgu1Vig7zYXg0Rt8C08QQN8quCeHeG8O5ow1vVhpJoUPyVL5yApjlRk1rQQIlbKTHz0YjBC49+QMOuffdYf5Y4qAmfDCkli2q/zWh1NypdF7IoBP+CTFJ0h/jTa750B5soRXvRV9W0I4SNWr77mwuYOG0ELreGP8eNy6Vx7mUzyRleQGNzcI8BXMlobfaDgI+fGgN2580JwPKoRIblYPl1pEtF6gq4VPSQgWVYjsIrQY3bFDTE+Ptvv8A1lxzDM/+8ge986WTGlRZmTjYRsHxJehmQAxkHrUgDIGUMZAhEIYH4BqJWIwW6ldmCJ+Ng12MrJcSsFlThwd4LS099eDFDc0/v8RhbGqyo/z1VwbkIFBSh89U/fxd34ELqawNUjikjv9DPf575kMheRiJapsritybRUpPe4zVW2kVWTzyAYL4Lf2uqjiIMGxFx7rukMIeLz5lG/apadmSogBA3LP7x2AJmzh5Hfq53r+bbXzgoCS9lDNl6M0ReAiQoBSieLyJQiEgFD+krp5SS9YEX2NjyCDYWApHB6p6KPGEx0xPFL4DQN7FDXsi9EcV/ZcbjHbLP61CELRllZcMfmVlWwuThnVV6K4YW4nZp3Xbq6A4fvTsBv90KpOa62u7MQV4yw/aYYbKrroU3lm7itfc+BeC4CRWoWmp9m/b0wCbL4J5HF3DjZxxb84TMnxQAACAASURBVL/ioBRpZOAnCbLHgDjYu/GH/0ahYrDO0OlaUNdGYzNT2NDyEKYMY8sYlowiu/HSRiyNPMPLyV6H7EK0y8sRaLsZO/RM2jmmHaYqOBe7iyJsySjrmlOLLp8wfTSu7rKeMii6nV8sQSQvB0Sni0xC91GUGbZLW3LHEwt4et7HNDaHaGwO8eqSDXjHFCMVnB/hFIyKDMvBtCTvfLAhw+AHJg46wku7CaJv4JC9E4aMMtk3mAY7h1VxDzHphI9bUiC8l7ExWtOrKsFhU+fT+rGckNeYKb8CkBC8Le28mNWCSHrckZCL1546mrtuuoybfzSB3/7tvx22dl1X+cKFM7oN0FJCBsLoXG3LS/MoKcqhtCgH6VGJDM/F8mkdBNVaYunklhKtNZ5ScVsKiBV52G6HiCcFphmGRSMWkVEFRIbkEBmWQ7gyD5mobdO13PaBjINPpLHqQLgcmRxoshQ+jrkJSQFsp9gzHUUfySq7lSHeIxmSewFC+Ik1TOt2SAU3iqIjpcGqwPlcW/4CLqUHgUe2IKWF0xTFgVcrRREazU0+muvzePPZGbS1+rEt55g33lvL6nU7efivX0JTFU457nDue+z99LA3Ca7mGGpCzrZ1QWPU5PknvkMkEueyb/wLW1eIF3mQquggZRqEwCxwI1UFVyCGVAVGgRvTrxP3gOIFPcnwFIubDCkvoHZ3IKV8h66rnHXSvjU++yxx8BFeHdERVhC2BQujHqwkibYxugLDbuOUYY+nrKA5egVBoyrDgAKwKXFP5aiym9nc9HPG+AJ7mIQnhewAhiF487HLWbEyiBAS01BJLg5vWjaNzUH++ch7VNc2o2squYakRZGJZCrHZq6GDNSI2XGmakiU6iDPP72EwyYOwd1moNSFOmzvtkslOsSP1DJ8zIXAynMRyXM80lKA4XcKNVkuGz3SSWyPW+eSc6bx5MtLaQ1GMUwLTVWoHFbM9Zcfv4fnceBgn1veCCGGAw8BZTgi471Syr/2dM7+bnljt90JoftZEzPZZOpdVDhQhZcTh9yLR3McRT6tjLrQAhbvurFbsUagUZlzJuOs53B3TfNPg44oW4oQXmKWExdz9wPLeOXN1Xu0q2umDUED26PiaogAAjNPRwqB3hbvqDTWXlTJzNERlk2Zx0ObR2Btak4xIUocpTUyvIfiS7ZEKoJIkcDIFQgE3kYbPdiZ2J2f6+XZf96Aqql8+PEWdu4KMHpEKVMnDT/gSu3t7z6tJvADKeXHQohcYJkQ4g0p5ad9MPb/BJHzLaQ6lGD9bd0qnh/W/YC43QJAjjacmeV/4LjBd7Km8W6aYivpGhmpY1AYfxZd64VtXLhoiy5jaeM/aI1tBMA/PoeCjTPYvamElLYfdpcVvCGCFnRMklIRCEuiRVJfEglEhuU41hdFgJTUSIlnZxC1y/olACVu4dnWSrQyLzPpBYioiZHrQiiCXI+bcXoum7c6jSvGHjaIm759Li6XRmswyswpld0r1Qc4+qI+fC1Qm/h/mxBiLTAU6D/CC4HwXUxJfpjdTX9PW7UtGcGyOgXUVmML82uu5+wR/8WvD6cp9knK8V5hM9sbQaN3oSeWbfJe3U3E7QDtL05JWTOXfvkt/ls9mdq5w4ls7bSX+7a0Eh3qR6oKWtDoXKGtrt8mB2aeq5Pszg07pDUzH48Eo7gHO7ktcbXG0FQvE4aX8bsvnMmI0kJag85zy8vxsHDpZr7z66doDoQRAs6aPZHvXHdKxi4kBzL6dLZCiEpgKrA4w74bgBsAKip6LvTfV6jMncOGloewLQOZUP8EGhIbUmzxElsabA48QU3ojbRxJrni6PQ2zkpnp3ostlxD8ldCCFClpKKoETlHUP3gSIwmF2rURLEl3pqgU/YuaYXu7nJmjp5xMqZPSwsBaIdnVxi7SWAUujFzk3o+2RJXc4wS1cXTv7ie4vzOFzEvxwPAmg21/PLPL6f0gHpt/qeEInF+872BVR29z8ySQogc4Fngu1LKtACL/mh5o6u5nDLsUYZ7xuBC4hWSEiUOGRxPlox09GftikGqlZHsmdUfk7B6JGYGXUAVNj4ljlAleVObHYtLvfOlETYoGTIRu17CVkVa1YF2GIVuxzLTpVowOC+Pakjcu6N4d7QBVkcEpNYcI9AU4sqT/sCtv3uBWBcv78PPfpime8TiJgsWb6Q5EMr0EA5Y9FXbSh2H7I9KKZ/rizH7AtJYjbvtFqapKznHH+ZMX5gxehw1gw9VFW6K3JMQQF1bPhvqywnF3YBMc1S1I7OuJim0PkEVnrQ9JgrNpg+hgssfw7e9FbU9aSPTC5V0DSkgUu4jXJmH7e3mw6wqhCtyiRe4sXQlhewk/V+JWxQNrSM/Wo+7KYbSfowteefJpVz+5XtSiLyjtjnjy61rKvWNwcxzOUCxzyKNcFT0+4G1Usq/7PuU9h1SSmTrLyHyIl3T/EpVizzFJmAr2AkqKEjyRZgCo42/vH8atW0+VGFj2QrXjlnFBUcswZZpnR+7NXqUWPPJxUOTpaEktEhLCkKWm91GHnYMzOUqStKbJAC3z4Vt2cRjJi63xqDBBVx67Ym8/uIy1q6pwVMXRuoKsRIvVo6e6PxBp9ILoCoYJV6MYg/+TYGMYpFAEJ/vy7zcSWitauaO+97m198/DyEEEw8fwo7a5rTy2YZlM7S8oNu/w4GIvpDhjweuBlYJIdpLbf1MSjmvD8b+3xBfBNGXyJTTKgSc4Imy0dDZYTq3X6GZjNYNrnl7OzsDgzEltH/UH9k0iQmFjUwp38Za00VECrxIxmoGle7MJkZFwAneKBviOp+Ec5CKZEe8iI2RcqQhsFtVoot8KeeUDSngjke/zlsvL6euppkJUyo44fSJvDN3JRvW1GDHHW+CMGw8dSGi5X6H9LbdjeXF2db+PqRBAlb6HgFg2Ly1aD3rt+ziZ986my9edDTvfrCeSNToWOk9bo3LzjsKv29g5bf2Wev5vcF+t8O33AjRnrtnd12h6yNeTpp7BXE7fQ04vGA3Xzv+tRQHFhKmu6MM03tu617X6OO6J88jf3ozqsuGj700v+RBhjuXV82l8pXvn8WFV6RnTH3hlFtpbkgXGyxdIVKZ1/2nRkp8mwMImU74bl+CxL5YmQ8z4YzyenQevuNLRKJx/vHwe6xcV0NBnpcr58zkvFOPOOBs8LD/7fAHIHr+I9gJSSBZPW0zXGgis9W+MZ7qrW2/xFrDxTC958SPsqIwwTUFBNc4n/5rvjiVp599x6kdaYHtAnOwwokXHgE49c8feX4JL7y2gmjEgAxkh0QtyR7kKq0t3tEKJxkyMfdMoaASx8tq5nbm5ZqmzYuvr+CrV87itp9d1OO9DgQclIQX3guRsVehS6UBKaHBUthqahzlTqX2iJxW3KpJ2EpNwtaFxfhBNRmvE5KiR1m+HSMHN7G1tgi3S+Nl3xvMvOtTio0wVRtLWNw8ktAoN49VLeX/jZ/Nb+6Yy6JlWxwToJT4FKf4aVdIvUs6XvuXOuHAUsJm5qQNHPOl1mW/45FViAzLTRnXMC2qatKrKAxUHBSEt6VBbWgBYbOGAvd4it3HYLsvwI48mbKYLY25qbOcW9bjMFw12WZqGFLgETaXTvqAf6+YhWkrgIJbMcl3xTh7zKpur/1q2MtUd5xyLbNoEzcUKgc3s7W2iNFHVHFK5XsoWKgKDBnSzGRrO3dtOJnXd37KGe7xvLdkE5Zlo2gRvOs3ImtcyLJBiKRaN1JArLjTCiTiJmprHDQFFIEWNCFmZhZdhOO4Qgi0kIHP58a2bIqHFrBRxNPeXpeuMmXi8N79IQYABjzhw0Yt82uuxbBD2DKOEBr5rtHk6qNpjngZpJlYUlBjasST/vzbTZ3tZvvtOyv12ME7+Yb3NRZsHc/GljJmlOzilikLCCkmqw1Xh1WnE4IYgo9ibmYrEXIzRVAK2F5XgFBtTrrwffQkY7uu2AhinFS6gW1bRvC1fz2WSLKQaG9vwW6OgB1x3AaDSkBTkaogXurFyk2UIJESqalIt4ZndxiSclm7zkbihCtYfh0rx4WiKNz4jbOpaWrj5YVrkdvr06ZvmBann5i5RuZAxIAn/NLdNxG1GhLeU0AatMTW0xxbj0Sh1eipNk1S7mfivxUFzVw5dREh08XvPz2bS9acyWlla2mO+5hZvA2vaqSJMBawxdCZ7E7XAFrDbrbsKqR4cAuqK/0roCmS8fm7+OS/kc4Y9LBBfPpo8LgQ4RjamirU9ZuJTx+NPaQQutZKlxJh2VgeDTXcaTmSgFQFImFOtHWF6GB/x82aquCTmnqembe82+YGHrfO+s27OHrqyB6e48DBgCa8YYdojH7SSfYE7J7qSfYSHiXOD8a9zs5IAQt2j2ZHpJjqSCGXDF+GR+1KXEHQThfkbQnVms3gSbvIH9uC0o1QrbT6UIMmKAmFwKt3mhVzPBhHjULm1WIPLkgle7sCoYBZ4MHMkyhRE09dGMujOjHxLgVhOsdJPfVFURXBk68swzC6tzQJIfZ7p4/PEgOS8A2RZWxrewnTCqeRfU8IGB5a4h6GeQOoPSRxKAIKXRHy9Qhjcnfz8NZjqAkXoiZIqyEZppn4hePEKlCsFAVWSmflr7I0zjnrQ1wek0B9DvlFQVSt87rxmMqKx4cjtrXg1RQiFbnpWrCmYo4dkur5ao+yhM7jFafAUnhkXopDSmb4yAkBI4YWU13X3CPhTdNialaG7z+sabybTYFHsGSMni3KqYjbgnCwjAtKqsnPa2RexJduakxCEodwCYvzhq7kzg2nsikwmBOKdnC0N4ICaAJMSUrpDykhIuHBD8bx3LPHYNuK09rGE2fOdfMpHhTAshQ0zWLFwsNZvm0MokKghDJ8mdptqO09m9ph2qBncJV2RFD2/DykhI2balHaDDSJU8IjaTyBU4v9G1+cRd4AqUjQGwwowoeMGjYGHupS/m7PjjMpIRYs57JBW/GpFq12zxUJ4paKq4vYMtwT4LFJr3K4vxmXsFO8+VpXE72AtpCbZ54+DtPofMThoMpjd55NSXkz/rwIu2uKiIQ8kOiVauUleS1tiXt32ImNl478HSvzdcbRJGcwWTZa2MT0aqnbe4DaFsezK6lmZkOEeJEHo8iDoghmHzOWqz43k7GHlfVqvIGCAUX4XeEPUhKhe4t3do3l95Wr8CVI/EnUiylFt+G+EUvntbqJnDdkZYLUkuM9MfxKFK0743YXuKRIIbsD54INdYU01BWmn6SIRLK1xLMzhBrttJWrho23Jki4IrczT9WSaMEY7gYnhMIeloOtpcr4SsxCmBLbo3am+Vk2nl3hNDu9qymKu8THjd87l2OnjeSeRxfw7V89hWFZHDftML71pZMZVJzLQMaAqlqgKT7ap5yvWIzUDIaoJmpnvF8aYpbKmuYKlKQ1vdpwd0t2KaEqXMSy5gq2hEoA8AMeQa/JbktYvrG7riJ7GEMRYFgpZE8+VW/urMbgrgnibog64QMS1DajozqBMG2829vwVgfx7Arh29aKa3ckUT67mzRDCbPHVXDysWP53s3P8OIbKwmGY8RiJvMXb+TLNz5CuIdGwQMBA4rwg/0nATYz3FFO9ESZ5Ioz1R3jDF8bo9wjMp6zO5pLg+ntsKFLCbWRnJRw15aYh08D5dRF8gBYWD8Kw1ZZ1liBYSvUhYuI2z0/qvbxZEKXzM+JMLg4PdlbUW1I9InqriSwasiUmPZ2CECNWyAlalscPW53vD8SEoqEMwnPzhCKYTsvg+28EHprDK3N6Pa6ALqq8unGOjZvq09RZm1bEo7EeHX+mh6fw4GOASXS6Iqf2bnj8JoLO+RmFefvN0lbz+aYTtd3uC6ajykV3moZxPT8XayKu6jwO67yppiXf20+kVbTUcoEkjJPgF3RfADqIwXkxguYU1y9x9VdiFTv/rQxdTz+6ye55T+zeX35WAy/QFFtVG8U773rCJw5ErdemPG7ZLvVjGEBErA8zp+sXcFsP98ocGMUeEAIhGE7mU9d5yhBb4kRHeKH+vQYIEUVnD3nKDZX1Xf0sUpGNGayfvOuHp/DgY4BRXiAXGtZmvQiBEhMShWV+i4rsWGrKNhE9QAfxdxIBJoiidsqd208JREd2R5KK6iLFgACnxLnwYlvUeqKoifMl13Njl2th8m/txdp+vk17/Js/VjnGkJBVfxYX5yCr0XSXa1UqSkYuTp6W2d+qwRQnBQ9hMD2atjt15EQL0xN2+sOwpZITSFW4nFk//aXVBGcdv5Uxk8eTvzTzD1m3S6NkcNLuh17IGBAiTQOure7J0c/mrZg3s6JvLXrcC4e/jG60llxsSZQyL1LTyFYm4sZcCFTDDJO9M0NQ1czyBXBlRS51XUV7w0UAV+f+DHCAlCwbJVwjo6haYiOFy2doPFBPqJlHmxNIBXHbBgenpNSXyZW6sbyao74o3ZOSHZT512SyIfFcVSFK3KJF7kxCt3kTxnCD26+CCEEkycMY/CgfLSkawnhxNWcc/LE3t34AYqBR3hX91026pJW9+eqp7G4cSSnl61hc1spc3dOoiacz8ra4fxt0Zlsqx+EjGtYrS7idT5kl2SIC0u3ZvSM7m34txBwyQlr8NfZuFosvPUWrjabeLJpW5Iq0yf+DYxWCR6WR3BUvlNMqd06IyXEbaxcF9EhfqLlfsebmnTRaJnPqQHZfgnhfDnihZ2mT+lSMYq9xEu8KWmDQgj+dvPnmTVzDJrq1Ig/cvww7vn9lQPeJj/gRBoK/gi7T6Kjq3YCFiqTXXFWxV0EDC+rWgZT5Arxcu1UJxPOUFhYNwYZV7BUkVRDXYANZquOXthpgdgeyaXU1YsugL1AUW4EDyZKi+Z8P7q0jBJCoCQqirU3LNBbYvg3SUyfSmxwjiO3tH9iJGBbIJwQBCsnNaRZGDa2LggPzyE/Kom2hLFcAmNQTnocDk5u6gnTRjL36SXsrm1h3BHDmTnrcG7+wflYlqNga9r+bzP/WWDAEV5RCrAHLYbgXYkO2w7xNSwqNRiiRPj57lF4VYOGeB4yscwJXTp80SwUbwSjwYOMdUZL2hENEoR3YVFn+BEiPXrwf4FlK5iWktKRI/nboaomp137EeOnbaVmVQnv3zOJNtNPLN+FUeJNCn9sVxwk7pY4ltvCLPAgFYHpBb3VwlsbQkkkhktF0DbIizXEj4ibuN5ZjXHsWKS/M7TY69Ep0F2898AHvGPZRCMGXp+LIRXF/OnBL+MdYCl8e8LAE2kARfGA5yy6rvIAP9l0Am/smkTI8kJ73egkr7xwdEe0wtTqwkKVSBvMgEaowccjqyZx0itf4OxXL+XhjROwMgSHtaOnLEkpYe6iw5Ey9VG3j6a7DMorGhk3bRuKCkOPaOD8mz9AKjhkbw8paP9JXEwLmbgbY+gNEQIjJVpE4qsOosTsDru8Ykk8dWGn1r3XhTlhGO7XP3GiKwWcOWsC37v+VApa4oSCMSfDCoiE41Rtqeepf7/X059hQGJAEh5INB5OxcLAYBa0DMGUSZ9fkVnuFlqCFZCw11nEa/xYrW7siM6yhiHUhPPY2FrEbSuP4fuLT8k4Ddllte6676N1Q7nr2cx6h6JanDJnMZfe8BZqorrBztXFPPWt2Zh+rfuBbem0pAS0qEF0kHAKrGaqVCZBD8RBUbDLC5GAvqqKk44ew03fOYejJ1VQV52e0WTETd5+5ZO07QMdA06k6YBSnLbptYYKInZ6n1QpwQo5Ciq2AM1GzY91rJbCZyBDOt15ayOWzps7K9ncWsCovJaUcee3lFHua+JwV2qcfMxU+McrM3jy/clIF+imk4eqN0XQwhZSh+HH1TNh2nbau95HWnXmfX8MVu12hGXhKvBjHDECWZTaxkZpdpQACcTzFBAS2U3kp4CUWvICUDfXceKMUQBE4yammTlaUskg7w90DNw78n+ZrgT1qSaZlkWrVcdqcYOVaF9hqFgNjmyslYZR3XsOMTYshZerRqVsEwJG+gI0S5FauE/C3Wun8rf4ZOpnChqngKXZeKva0FsNFNNGjdjUvVvIqlcqAWit0njukuFYVQ1gmAhbojYFcb+/FtHSWRRJIFG37yY62E9odD7xohz8OwThwd20tRFg+TSwbZTdnXVqbrvmb+zc1cLtD76TUrSpHbpL5YwLu6+ZP1AxYAmvKH7I/zOdTiOoVIKOktoFVpuLdF+9ACmwgq4eZfB22Cj8c+0U1rYUdW6zIWwr5Csy5UEKATm6gVd1YlakLkBGEbJL7yVLYcnD46h638eT51XQulUBN3hma3jP1VFKBVg2+qfViTBhyZhjNmMeUYHld75kqgm5NeBuVjHydJL9blKArSmYHhViJvqKre13jqhp4smXl/Lx6ioi5b6OEn0ycZ6rwMvF1wycuu+9xcAVaQDFex62+wyIPMnW1mU8tkU43eaTWZWh2FAnBDKiIfJ6FxBlSpWffzSL5053at5EbY132sqYmlNHVDN5r2k4bzcNo0iPcvHwTfg0g9tWH0047sK/w8gYLmCbCu/cNBwzYqFPUim+w4cdVAjNy0UZ7UEZLjFrW5GqQeTsKPY2kJraWWoj4V1VJMRLfZg5Bmowgt4cx47FMVygr9qNWtPUkeoHgJTs3BVA11XiLpVwZR5ayECYNpZbo3x8OS53ung40DGgCQ+gKC7wX82HdWPZ1vYmFFrOX7/jgB60SgAEZnNvTW+C1c2lxG0wbZWbVx/NZrcHUxr8bfN41ocLidg6KjZP7hrDj0cspWhYANnsTSmrlwwpIdzmA62N4r94Ebqg+S8l2AG142VViwvwrW/FKgtTtWIwDCKF7J3TE9geHWFDxK2jr2zA1dClrq1LQ8ZNRGkes48dy7LVOxLPSWAmEsM1VTmospySMaAJL6VkV/h9qoOvY5k6cbcGIQ011+hQBIUCSo6BHexeKSXe+8dgI3irLZewIlkt/NQECqjecRxBv4qdKKVhoWDZCrdtn863tq7imYcmYFoZpEdN4p0ZQR/nonXLSHY8kIe+M47aYqU0FwYFRULuw80Qq8c1ZRRGWS5SySy3KzELq9hH/NixuBauQ21KKuZUXoZoamboxcdy5qwJ1O4K8MTLSztaZCpC4PXoXDFnZq+fyUDCgCW8lJIlu35CXXgBlozQGs9DzTkZ6l3gFkiX7DBJagVxTAvsSA+k7yU0xSasSFRFcvXID/nD2jMJ5arYGdQhYUsenzcB1VTS92qSop80IIptah6rRNlk4m5u9+xmmKMEobmQwSjKumqUnDFY+enFmIRpI9tXflUhPmsCalUD+ifbEJaN4vciBdxy4xw0TeX6y4+nYmgRj76whJZAhKOOrODLlx8/4BM9ukOfEF4IcRbwV5z4rfuklLf2xbg9oT6ypIPsAGHTTb47wjdOepXl1SNZXF9Ji8cNCIQAvSSOFbGwAzrSUBKBZJnI354nm54vqwqLYys2dCR/K0IyMa+Wj1syN3hQNigo3UTTCk0S2egm8G4pynoTvdXo+VUUIA0TqSrEpo9EJoopdcbf4MTB7woRHpLjjJV4GaxhxUiPjnvRelAUXEV5FJU4hBZCcMasCZwxa+B04tsX9EW5bBW4GzgdqAY+EkK81Nc9niw7RlVwHrXBd5DYGHaog+wAZd5WphbswKvFmXXYOqaN2Mo/N8+iJeql3Ybi8cUpyW/lgfFvctrcy7FkJpFAdPlXoismEsFRQ7dw3viPATClwtZoCQU5USZrNaCCEJKI4aK6tYCQ4SbvPbvbcncyqhB+Mg+7QOLeE9mRCJdArfASlYXIHE9quxvnAeGuacPWNXw7gkhNYBR6HGuOqmAX52Ln+1GF4ITTJ+HzH1whA71FX6zwM4FNUsotAEKIJ4AL6cMeTzXBt1m860f0FBqcp8fI18NoidXXr8QYW7SbqtYiaoN5+BWD80q28s3hqyh2xTiyqJ7ljeW9uv7Iihq+MHoxuW7H9W5JwYLAWNosNxIVd5IdX1dijC/ZRV1rLmqdn55EKAG4W3pjIRIoJQZFP7TYfrtTgez/t3feUXJVV77+zk2Vuqs6J7Va6qAcSAoEyWCyABk8TmDwMGAMXm8YPw+2sf38xumNZ+zxmnF4DmMPxn4e8DjgMMyAARMFGJRAAoSy1JI6qHOo7go3nffH7aiqbgnUjaTq+2n1UtetG86t/tW5++yzz94ZqAIFLwhNAFigpgZJl4SwC7wYelngTWDd8vHss8Yzganww88Cjox53TS0bRxCiDuFEFuEEFs6OjKDshw3TWfyFXrSOxmbwjtld7Ox7dNMJvZhFNxx8eor8w8yJ9qNprgMuga7E4XsS8botgzeM2cPQeXEEgw1miU0JktHzt1sFjI4JPbM+wRFgVmRfkTU4XhrWCcyrMahSgKLTETIRUQm2fuY0AIhIdDprWNFEYjBFIGgzrZNB+jujB/vqjnJOzZolVL+GPgxePnhx77XFH+CVzq+AghMFw4lalhQeBdFgdk83/rP1IaPn31CStjUVct5xUdG/uiVgX4u1Xai2DYbO+rYNlDK7W9eAUiCwmJlaSvPt81mYslJFMNBqPCrwytpWPwIIc2m3YziZBH7WFxNUPK1Dux+lf4fFuIcfJs+bSERAUlk3QBKACK1A8T3GRnlSETaQXUmCC+wXKQmcPMCpFMWP/z6f/Ojf3qE2nkVfP6bH6KyuijrcbnIVPTwzcBYp2310LYTot88wNaOL2HLBLv6w/yfHZfw7wfr+NyWJ/noiz9n0Do8YqZMhhDgCpXN3XOwx7j0IqrJtRU7uKPuBRZFW1G8hXGkpMHZc5tYXNBJZpYaL1WG0FwWzj2MKhwkgld7arBdQVAxEcd54ggBigZGkUPB57pwl1mErxggsj6OVmsyec8/dP18h+DqJMV/14la5CJNCKoJlKQ9EkCG4yIcSehoYuKzqZ67yo2FkY6DY7tYpsPenS18+tZ/w54k81iuMRWCHVUpggAAIABJREFU3wzME0LUCiEM4Ebg4RM9+GD/b3GlRdLWeeDQakxXJ+3qOHhrTVuSMcxsPuwsnF1wmEdblrI3Xo7lKiQd1dOEFNREerhl7iaqw6ORgT9uWY5akqIiPEBQtdAVLxZH6A5aSZL59Ye5uW4j9XkdaMLhhY4GeswwVWoPmdEnE6MokopPdJL3F3Ei6wco/EwXRV/sIHJdP0qF5S29C6oky4Iky8M4QQ19forSb7YTu6MPtdRL44cOpAShlkGCzQMYXUmC7UnCjf1egYRj8OJovEErQuDMLsHdtR+3z5uMkq4kkTDZ/MKeE76XM52pKExsCyHuBh7Hc0veL6U84VwOabsLicOO/llZO71XeuZwSdkeNOket07q6uKDvNjZwAOHzqdAT1BkDNJjhlgQbWN5QTMpR8OV412Oe9KFyCKJNC2kraAbaRTdJaql+EjtRgKqw621L9NjhuizQhx8rIr4wTB562z6ClXveXGMdTN2oXd6c5DEs2GkJQiuThK+OIFigJjtIPKSpLaGELpENR3UDgcr3yBZFcFsdQjuHSC4wEJRxMg5898Xx2nTMHcEIZXZM0tGbg0nrJGqGFNLSlOQugpNR5GRMELTcCyHjrbMdCK5ypTY8EMFzN5WEbOKyFpaExswXS1L/nVIOgY/3Hcx75m1nfq8joz8oWMxVJf3z97CTw+uodcK02t5f+yXu/J4uav+mL3lUC8tiRpJ4iKIEpC4KNTldfDhuZsxxuRyLzSSXnLV80we+tUamoxSUCBckALhEoimiRQmKW7oGVlPHf95lOSmEKS9J9RAk0ZqY4iiz3YhNOj/cSFOmwauGLkvPW7ihjTs8hhHH42iPW9R8b4mjGLPmyMCELluwBP8REiwogZmeTjzvaFeQ/YPIIoKEIpgwdLqic+VY5zymdbqvCvZ1/sg8/PbeLw1+z7dZh4/O3gRICkJxLmu8nXq8zuy9vg14S4EkgmKsANeGZvz8tv5zoIN/OpoCcWFcdKORkc6j6ieJKqnJzy2cPYAy687QGtLEU5EI9HjLWpOdEfobnQJlKXIi6aQ7QrJl8NgjWmHpeC0aKS3BdEbTKxG/ZgQAkZyx9hRA2kLrB6Dlv+oYc7/2DcSLqEWTZLeevge46ZXqNgY8/hJmZCyhgY8ngk0t6EcRRHsfr2JhkWVqDmydnUiTnl4sCJ0Lp51P5dVfYzzS5pH7GgPyXh3pKAzHeVnjRfxdNvCcYPTYXQFKoITPKKlRMNlVX4b317wPGHVJmKpuC4EVJvqcO+kYh9m9tXt3ifnjmYakEhQBXs3VdPcESO1O5DVRJNphfQOA5kS44Pcxt7luLwyAtdSSDZGvOMdsPZPVuRhFDVhjdw3jkvg5b2jT8j8PBRVcLS5m3tv/wmfu/On3HTpN3j15f0ndO4zlVMueABVCVJfcCM/vOD7fGaxwdkFLSyPNXFb7X70Yw3kIV7pqckevyJgRdFhNLLkTxQQ7jJR3wzxxJt1PNA8H6swmbU22ERICS3JGPHlDnZ9Cjdm40YcZIWJMzuF6DHoeHYWbS8Xk60JKBK1wEUtc1CCmReTgB3RMzY6CRXpgrQEAw+Pj3ORClgRjURlGDsw5vNKmojmLpQ3DhN87FWU3kEQAlFShAgYSFfS15MgmTBJDqbp703w5f/5QE776E8LwQ+jqUE+Mu/vePCS7/PAJd/mrxb+gIma2GeF+UXjKtKOmiHS84oOUR6Ko4thxXk7zI108cl3/Ylne6v54sa1/K67Bl1xMjKGTSZ6IWBecTvSVElLnfQsl/Rci1RYRbQZI+OCUKNNVv++CyLkIm2I3tYHhjva02sSqQvMovHT/tIV6MVpnH4FaUHsrh6Cq7ywCitfZ7A2RroighvRSc3OIzVU8Ezd0Uhw0z4C+44iLAcRCRNcWEekbhahSCBrvLt0JM88kntrWYc55TZ8NhShowidQsNBVxQsJ7vNunegnF8fXsEHa7YQUMcXC7uzfgNv9M3ijb5K9sYrsKXCVRU7CKgOstTGSUOhkRjyy49nWPQTJV3SNYvzlx6gNJjgaDyPzftqwFFIlUoihyUiZjHRJK5EEH8oxuBjeRR/voviL3aSeDqC06miL0jTc6gMusdc2HHRU2n0QgtFdxEqqPk2+bf2IspcBnZWZcTF24UB+hpUou0CIw7hojw+9rWbOGfduex49TCxgjBNjZ387Lt/ymifadr0dg9mbM8VTqse/lh0ReXjC95FYIK4b0NRqQxfQLaeVFMkZxc2ccvczdw97xmqgr2UB+NICUZJEmEKmgcKsh6bdlSeaZ+PlSVjsOMIdiTqyctPktAF0aJBPnD+NvKNJAivJy4KD+LkZRwKQ1cTLsi4Qv/PomgVDtEP91P4iR5iV8W5+q7nIZ5AFQkCZYOUrmul8q7DI2IfRglA3jVxhJHd/+6GNMzVtbBgLms+cAE9bb1oUnLl9eey+uKFnL26Pusi7WDI4OzVddkbnwOc1oIHuGP+Rdy77CqKjcjItoCiEVR1Prn4Mr53wV/SnL4Z01UxHQ1HZpokMSPBwrw2BtIGXWYEVxEoMZtD+yo5PDg+FbbtCgbsAM+1L+An+9eQdtSRwbHlKhxKVdNmh0hLFXPop9MJct05OxDSxUwbdLUW0ftuhSwJFEaRAmufQcROoeIQUwdZHT1AVbSXyOUt1PxNI9W3HSZ6Tj9auZvh6wfAZVy2tFG89bp6EhRF59FNB3jw63/go4s/ycZHtgJQv7CSCy9dRDA02khNV2lYVMk55x/rws0dhDyRFcxTzIoVK+SWLVve1rHNg710pgdoiJYR0Ua9FW3JVnb2PEJUcxm0ttKZ2kbCcdGEy+54Ob8+tILPLXycuBvge3vejSsVeDOEPgBrL3yd8+r2o2ouO/qqeLJtEUnHO3ehPsj5kUbKtAEaRQzLCGJn6ScM4bBhw2L0Fg2iDs7iBJE3HAofdVHS2aN1hOpy24OPow1FWzpSsL2nmt83ncOSsqOE9DElKLOYWNKCQz9owEmN/2ZJKXFVCB5Nei7OfB3HSWFs3k8kFuah9p+g6Rqu6/Kjf3qUh/9jIwhQVS872kfvuYobbr7wbf19TgeEEFullCuyvXda2vCTMStSwKxIQcb28lAl5aE7Rl53JRu5/YVv0p6O0GtFKA30oyoOpXqckGoy6ARhcRJnd5DnnjuHZ19fhjs/mfGJ9FgR/nhwOUpzAHfRAKtrjpANRwqMFq8igasADpgEEGZyghkBSdnCHuSQVtOOStrVeeLoElwERwfyqS0cDYPIELsLqe1B3LjihRyMQQiB6nqZy6QqUFxwKoox40lCrb3s3ryfJRcuYKA/xR9/u2UokSvYrjcOuv/bT3DuBQ3U1JVlbfmZzGlv0rxdikNzqYteQq/lmUKOVLz1rQJunLPFCyUG3AUpZMyBhJK9G3ZBDKiIPhWkQpWayAgcE7hUOikM3ROM6FNRdoUpesacYAGIRA04tF0e4OmjC3i1p5rHWpfwrd2XEbeDgCDtHKcvktDzWhHy2LqtY1EEdmEQa2h1lDOviv6z5qINTUa99MxOFCXLOMV2efbR1ya//hlKzgoeoCFaOvJ7t5lHrxnGlVCX18lnFj3BysIDyCSIfhUlpUKf6hVXHUZKBBKtw6vIob4ZZltbJSHhoHsJ3zGEQ0Q4vPpcPbPyOlEVCyEFeqsk0Je9MKYEata1cuNFG3mxq4GHjqxgU3cd5pDRL6RLvj555mKZFoQSSUKH+2GoDE72nIIgh33zmopTECEZ8tyetu2QzaR1XRfTmqAO1BlOTgt+Z9/4BaUPHlrFoB0gZWsEhUV+2sFuHR0Mq7vCiDbdE70E4irp9jCrFuxFES6iX+PwM7PZ/mIdBX2S2VaChel+2nfGaGot4mB3BY6rAZJg9ySCEYKX585mwA5wXuwQijvmieGASCrkH/F89dLxzJeMU+gSu1FHsSShlqGsBNnGY8d8CRRd5c19RwFYtXZ+VsEbAZ01l53ZhQ8m4oyz4d8KSwsqeap118jrznQ+39x1FfPyjhKxbTbuW4A7psiqcAXqgRAcCOHi4oYFSrnNnLJ2XtUaMC0V4QriR2I8fuRsdM1i5ZJd7No5Z+iTHD3XcCavY00aCSQWQapQ5ZnWBaxuOcL+Z2bTv1rgBiC0yyX2vMtgKkpSz0PJcyj6TDdK1EUM2epuGpLPh3F7VQSgWBKt38SOHbNONUuvbxjaSEaC0ooC/vLuy/n59570entXYgR1rrz+XBYu9/PSnHF8sPY8/m3PiyScUdedIxV2xau834UABaw80AckYkw6PiEEZswFR6F+dgvhoIllayNpr4Vw0TWHP29fNqTq8cJKlhnEdmdO4EgNeq72Yv33Hyln8Nul5AF5r4x/IkgByWgEoy9N51dLyVsXJ3BOGpkSJJ6MkHpptBKHYCjgbFjwUoILWtrGDo+OaIXw6jStXdUwsu39t65hxYXzeObR7ViWw9orlrLorNwUO5yBbsm3yoF4J3/90i9pHOzKeM/sNryswVKg9YPeLxAuuAEwYy56n8ANwnvO38j80hb++Pwq9h+ehQTmVLVRVtDDph2Lh2IzM+1no9uieHvcCx0YCsPvfJ9KcqECjiT8pqT0oeyzyBJIVUW8rAOORO9LYXSlJ4wBdTVBotarPqgkLELNgyw6u4a2qEpbVxykZHZVIV+9Zz1zqr3My71dA9i2S3FZftYiZmcqOeWWfKvU5Zfwgwtu4i+e+VdSzvheVIuZWIM6CLBjYMeG0mebEGpTwAU1DX96agWFV2/gQ1dvIG2raMJhR9NsHn5srbf/BDI0i3RaLy5ECyYgZpGuE15iVUA4ENsw+dK60QeOnFTsErDzhuYkXInRa6JrChdespAP3LaWts44qiIoHTJljjZ184/3/poDe1oRCEorY3z26x9k/pKMtfc5R84LHqA2v5glBVW81tOENWaAqKggQjYkVcbm/w12Cs8dOSQxx9b5xSOXklfVT6x8gPZ4lHTcQM2SrCkDRWCaIS8u3UqDIjFaJEV/dDHaJz801DyIWRLECYxJnnoMEpCawCwwwJXoPSnUQQsbOPeCeoQQVJRGR/Z3bIdP/dV99HTGcYfCkJsPdfHZO+7np4/cQ0FRJPMiOUROe2nG8v3zb2R5YebKHr0wTXEkTkC10BQHQ1oodmavLaQg3hZl/9FykkGFQMLlRD4+yVCKjKNQ/S82c75qU3mfQ6B5OI4++3Lu4fQdRldqwvBNCbi6QmK213MHWwcJdHtPAiFg8wt7M47Z8uJeEoPpEbEP49gOT/3Xq8e9nzOdGdHDA8SMENdWL+WN7mbSYwqzChXuvOBJOvoLaB+IElHSPNJ8IXaWiR+huehzEmALnPj48o1SjB/0jiU5SxJuEShK5pdkgo57zIlBTbu4huLVbzrm4HTZaA6TVFWE4MF+NEd6lS3Tma7R9tY+nCwVP8y0TWuW0je5xozp4QEqQjE0NTMKa2vPXGqL2lhbu5tzahqJ5Q1yrAylkLhllpdSr0dDHVOw2AodP0lUulxgLDTJu7GPyHVxlOKhYgmcQCImKUlV5eEGlJEnghSQLgnhhsd/MdNVoyZJtoHowuXVWbcHwwZLzsmeIzOXmFGCX1veQL4eRDlGYs93zKNxsATTVbFclRuueAFFdZHD/4RE5jnIWSakBKJZH6dSqxDciZ6VCiAki5c1Ebuzh8jlCSLXDlDy1Q4C56Yond+L0CYfvNp5BlJTSFZ5McdmTGewNuql0BuLEKOzqsAv73uW//zFSzhjatzPWzyLZSvmEgiOuit1Q6W0IsaaK3JzsmksOe+WPJbmRC+f3vxbdvR6HgpDUUm7NpbrUBXqZVaolx4zzP43qlFaDYSj4NQmkZUWokdF2R0CV6AIiZQKEkmiRqKmINAhxpk1UkjsqEtRQw/z6lszJoGE43J14XYaX6zg2e+cQ7a+XgKDDZ67UetNE+xMkS4Yrt+a5dkgJaHGftShAgyqprBwWTVfv+92dN37VlqWzR8e+DN//O1WbMvh4quXceMdFxPJnyQTwhnEZG7JGSf4YbrTg9iuS4ER4h9ff5zfH9qGi6TIiFCfX8Kfmw6ibslDSIFdl0DpNBBx1cvTPmR5K4r3BBiY5U1gqQkwegTCBqmCHXG5uHgHkdWDdMvMfOsaDqui+ylRB/jZzVdhpTIfE8NemERNPqGWQdSUgwMkG2ITCl7rMwl2jGZWDoR07vz0Oq79QG4WOTiWyQQ/o0yasRQFIpSF8jFUjS+dfS2b1n+ODes+xTNXf5JLqxZAQOI2JJFIlBbDi5iUYoz3RuC6CoqQRBIWuBIn7A1QE3MkySqJLhwuv/w19ElMFgWJUGDZew6gGpn7CUDYEr0rhZJyvEo3x7k3Vx3/RUgnLZ7O4XWqb4UZK/hjMRSVAiOEEII1ZQ0oQiDLbexzBhApL4YmG46jIbsMtLjnux/+eXfFAe5Y/xKN6RpqtAQqmWJWcCnSvPCDcz+4l2jlABP5bIw+c8TiEYBI2hMGi7lG5sA8lTyxwm25ji/4LMzJK2Jd1RI0oUDQi3+ZDIHA6BWEjkCoBe4++yWU+kG2WYXsSBexLVlOUDgouCg4qDgorkv0TRM76alYUaFiUfcE5/ewQyq24X0lgm0TJ0/FyMx82bi3jQd++PQJ3X8u4wt+Ar6x8r18dtlV1MeKkQWerT6W7JNFgqLYADsjeZhydPbWQsVCZbHVT4PWzrJAE90PVLLx4XN59BcXcWRbEe17Y8hJksYKQEs42IVhBuuiOEZmzuOx2JHx31LHdvnVTzbQ0zUwwREzg5OaeBJCfBNYD5jAfuA2KWXv5EedGahC4Zb6VdxSv4rDK3q5/l9+jp10QGb3nQ/b9pcsOUB7FiWaUiUVFrz0+HIKNw6SOqhgRNMcTFTR9Fwx2oB9XH+8APS+NIPVAQaqYkTaJpa8WRJCG4yPO6emq7y+tZF3Xbn0BD6B3ORke/g/AUullMuBPcDnT75Jpx81hQVs+fLd3PPetSyaU5ZVmKphU7fmEIcrNVJZiyVIdOlypL2MtkMxhAtGb5pwyyD6CYh9GMV0SRcI1MlMciGQmoKdN36xqwDyornheny7nFQPL6V8YszLl4H3n1xzTl9UVeG2i1bgpiW7DrVnGDjz332QQP5weoLxKbmH2WkVUHN+E10yitbpENrt+e9h1EQSx/x+LE7Q66Pk8boqRWDn6egDoxmhAiGds1bUHvdec5mpjKW5HfjVRG8KIe4E7gSoqTlzp7BX1FejayrmmHiUSEkCI2IyPl/UsdIVIKCwpg+93GRPawmsh+LfOoR3evvZAQUUxct+rAi0hD1uxZQUkKzyYnisiCDULScOxJES4UoURWAYGnmxEH//w1tzPjvw8Tiu4IUQTwLZyt19QUr5n0P7fAEvdeiDE51nshpPZxLLayo4f14NG3YeHNmWXzaAok0Q8yjluK5aVSA/mEQPO5iORuf7NEr+XUPqxviJJClxu1MYvWlwvSWD6ZIgDM2WoggGyxXC7WNKY469lAS9z0QCsaII9z/yt6hZ4ohmGscVvJTy8sneF0L8FXAdcJk8FdO27zBCCL57+3v4h989zW9eeg0JFNdmH6d7S0ozDRNXCgKqjTkUkZlcpBDcf8x+QmAVh7CKguOsI8WSBHskqUJwDIjP8ux5Iy4xBofqPgmB0ZlETXsTVX29CfbuaMnZdapvhZP10lwN3AtcLKWcxDGcW6iKwt+9/3JuftcSfvDCd+kIWycQ8jiKIiRJ2xtQKopg0oKAQgxZRxJMFwyFQFyiJyRW2HtPT0gUG9S4hT5goSbtcTnmFSHobOt/ezebY5ysl+Z7QD7wJyHENiHEv05Bm84Y6soq+eL6z2cNOYYJQ13oSoSxXe8YoQpiXaFx+2qq8Oo6DR8gJSLlEGkewOjw6q4qtiQQlwT6PbGDF4ymJqxjCiqAZTksWJb7y/dOhJP10jQcf6/cJqpHKderaEodGSlJAxPnRZISWuPRkeImi+VsvvXVG7j/Vy+y9Y0jFBdEuPm9q1h51hw2vXqQr3/hIUR/muFyU3q/iVmaPVLSjgUI9JkorsQdqtkaCOlcft3ZlFZkpiecicyYFU/TSUXnRTTqD6FoNkId1WI20Qvgyuhh+gZDvLCxjsWrn2KX9Rh3fexvKQtfO27fy9Ys4o1Ll/Hkf23Dck4gE5giKFxZzSV11Wx8dhehSIAbbj6fK64/d2puNAfwBT8FCCvMjifms+DKvQTzrXGCP1b0QpF0hFW0SJprb9hOrWymz4zzQuvHWVZ8D/MKPjLu3Hfdew1tLT288cohNF3FthwSY0spOy56bxpt0EaqgjvuuILL153Fx++95h259zMNX/BTwKVL6/mPLX8eJ3bIbtKA8MLHJLTbClGjlEV4NZXe6PoO9dGbxyU4DYYM/uFHt3HkYAfNh7qY01DGU5v28q8PPg+OS/hwHOHIEdfk//3SH+hs6WPttcspL8lHm+F+92PxBT8FLJldwYWrIxwn60YGLgoHzChLXQVHcZE49Jm7KAwuzth3dm0ps2u95LAfrlrFoeZunv791nFiB0inLH763Se474lX0AIqd996Cdddtuwk7i638KMlp4iPrr50wppQkyGEHFeiyVCOP7hUFMEX/mYdC0oKJ0jHDWY8xcBgmm//5Ck2vnow+04zEF/wU8Si2EIiambl62E7fuhVxvtRxcIcqm+pKzEiRtUJX7O8cuIvhxxa9ZRK2/z8dxtP+Jy5ji/4KeTvl32FAr3ACyEe+jnaFqO7Jw/bVNFx0YZWPmm4GMLh0ugBhFBQCHDxrPvf0vXe+5ELx2UfgCFvp6GMq8Dd1uFPOg3j2/BTSJFRxHfO+We60l38eNsL3Ldxz7gUfiWhAW48azu2AUHXRZgrmVt0LlGjnurIuqzVOCZj+YpaPnjXJTz4/adwXenVdjIUUlWjJQQVRXDWIn/SaRhf8NNAcaCY9zes4YGtjSTtUf95ZzKP77180cjrDy1ZxvzCy+g3k5xY4r7xdHYP8MCG1xmsjULSc0uO7dkVRRAM6Nz2wTO3QNlU4wt+mmgoKqI4HKapP7s5EdI0zNAAF/z3P+FIl4CqcfeiS/hI/eoTvsYvH95MKmV5FadCo39KIaCoIMI5S2bz0Q9dRHVl4UneTe7gC36aEELwo2uv56bf/ZqkZY3LWhzSNGpmBXm6cxcpx1ugkXZtvrXjKaJ6kOtrzjqha7z6ZhNWljyR4ZDBV+9Zz1mLM5PHznR8wU8j84tL+Pa71vHsoYMkhU3cNokYOlfVz+fzO35Dyh5fnz7pWPxg13MnLPjqigL2HGjPqNNkWS5lJZmJn3x8wU8bhzt7uf0Hv2EglfYKFjguN6xcwv++5lJSjk3yteyLUttTJ55V4KbrV/LC5v2kzdFxgq6pnLV4FpVlsZO9hZzEd0tOE5+4/z9p7x9gMG2RSFuYtsN/bd3JH1/dTVDVKAnkZT2uIb806/ZsLKyv4Cv3rKe4IIJhaOiaykUr6/naZ66fqtvIOfwefhpo7Oihubs/IzFY0rT45YvbuebchXxi0Qq+vO1JLDnqVdGEw+0NJy54gDUr67nwvI/T2TNAJGQQCQeOf9AMxu/hp4GUaXkrmbKQMD1Tpjr0GDfN2UyhPpxeT+JKeHD/EyTt9Fu6nqIIyorzfbGfAL7gp4GGihKMLKugdFXhiuXzAehIbiKgmgwMlZr3CtirbO8t4d4tv35nGzyD8AU/DWiqwtc+fDVBXUMd09PbrssDG15h874jGEoBz7XPH2fSANhSZUPbIbrSmTVefU4eX/DTxLsW1fLgJ25EGRNCKSX0JlL89U/+QKn+YbrNPLKt/jYUjbakH/8yHfiCn0Z2t3SgZ1mA4bqS1/fOZVlBEYLM+lC2dJmbV/xONHHG4Qt+GukeTGLZmYJO2w7d8QSfP+vjhLXguD4+pOrcNX8NYc145xo6g/AFP42srK8eZ8MPEzZ0VjbMZnakkAfX3k5dXgkCgSoEZxdV86HarNVafKYAX/DTyOLqci5eXEvIGJ3uCBkay+dUcv68GqSUfP31x2lK9CKROFKypesQH3ruPtInkqXA5y3jTzxNM9+45RoefWUXv934Bo7r8p4Vi7lh1RIURbC9u4ntPU2k3VFxW67L0UQ/Dx16hZvrZkYRsncSX/DTjKoorF+xmPUrMhdm7+htzQj8ArCkwzdee5zzS2qpj761mVefyfFNmlNIdbgAdYJVTpZ0+dK2/36HW5T7TInghRCfEkJIIUTJVJxvpnBReT0xIzTh+692HcF2j1/W3ufEOWnBCyFmA1cCh0++OTMLVSg8+K7bUSfI76EqyriJK5+TZyp6+G/hpczO+dzw00FFKMrNdaswxPgJKl2oXDNrqS/4KeakBC+EuB5ollL6ZZ5Pgr9dchlnF88mpOqEVYOQqrOwoJwvnHX1qW5aznFSJW+A/4VnzhyXXKnxNB0EVZ3/t/ZW3uxtZV9/B3PzillWWJW1eojPySHebpUaIcQy4ClguPJHNdACrJJSHp3s2BUrVsgtW7a8rev6+BwPIcRWKWXW6eq37YeXUr4OlI25SCOwQkrZ+XbP6eMz3fh+eJ8ZxZTNtEop507VuXx8pgu/h/eZUfiC95lR+IL3mVH4gveZUfjhwacZhzt7eXjzm8RTaS5eXMcF82v8CagpxBf8acQjW3fypd88ieO62I7L7zft4IL5NXzr1vUTJnbyeWv4Js1pwmDK5Mu/eZK0ZWM7Xkhw0rR4ac9hnn5j3yluXe7gC/40YdO+I1kXgyRNi0de2XUKWpSb+II/TciWv2aYPS2dWZcC+rx1fMGfJqxqmLhax9G+ONsPtb6DrcldfMGfJhiaxvtWL836nmU7PPn63ne4RbmJL/jTiIbKEkKGnrFdVQQBzXeoTQW+4E8jLl1an9VWV1WVa89ddApalHv4gj+NiIWDfOOWdQR1jXBAJ2ToGJpKR+lFAAABx0lEQVTKp65bS1150aluXk7gPydPMy5d2sBTX/oYz715ENtxWbtwLiXRyKluVs7gC/40JBoKsv4834SZDnyTxmdG4QveZ0bhC95nRuEL3mdG4QveZ0bxthMxndRFhegADr3jFz51lAAzLV/PqbznOVLKrIn1T4ngZxpCiC0TZcLKVU7Xe/ZNGp8ZhS94nxmFL/h3hh+f6gacAk7Le/ZteJ8Zhd/D+8wofMH7zCh8wU8zQoirhRC7hRD7hBCfO9XteScQQjQKIV4XQmwTQpxWlS98G34aEUKowB7gCqAJ2AzcJKV885Q2bJo5nYtj+D389LIK2CelPCClNIFfAtef4jbNaHzBTy+zgCNjXjcNbct1JPCEEGLrUDG70wZ/xZPPdLBGStkshCgD/iSE2CWl3HCqGwV+Dz/dNAOzx7yuHtqW00gpm4f+bwd+j2fanRb4gp9eNgPzhBC1QggDuBF4+BS3aVoRQkSEEPnDv+PV8X3j1LZqFN+kmUaklLYQ4m7gcUAF7pdS7jjFzZpuyoHfD+W014BfSCkfO7VNGsV3S/rMKHyTxmdG4QveZ0bhC95nRuEL3mdG4QveZ0bhC95nRuEL3mdG8f8BINQXuTg0NKEAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "f4YxHL31sZC4",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "X_train_PCA,X_test_PCA,y_train_PCA,y_test_PCA=train_test_split(data_2d2,correct_facies_labels,test_size=0.2,random_state=42)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kJqVkh7Csa7U",
        "colab_type": "text"
      },
      "source": [
        "##PCA的随机森林"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "DbrN8__ctdFX",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 656
        },
        "outputId": "cc6fd11f-c419-47c4-ba02-603dba038640"
      },
      "source": [
        "#降到五维效果较好\n",
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn import metrics\n",
        "\n",
        "rfmodel = RandomForestClassifier()\n",
        "rfmodel.fit(X_train_PCA,y_train_PCA)\n",
        "print('model')\n",
        "print(rfmodel)\n",
        "\n",
        "ypredrf1 = rfmodel.predict(X_test_PCA)\n",
        "print('confusion matrix')\n",
        "print(metrics.confusion_matrix(y_test_PCA, ypredrf1))\n",
        "print('classification report')\n",
        "print(metrics.classification_report(y_test_PCA, ypredrf1))\n",
        "print('Accuracy : %f' % (metrics.accuracy_score(y_test_PCA, ypredrf1)))"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "model\n",
            "RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,\n",
            "                       criterion='gini', max_depth=None, max_features='auto',\n",
            "                       max_leaf_nodes=None, max_samples=None,\n",
            "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
            "                       min_samples_leaf=1, min_samples_split=2,\n",
            "                       min_weight_fraction_leaf=0.0, n_estimators=100,\n",
            "                       n_jobs=None, oob_score=False, random_state=None,\n",
            "                       verbose=0, warm_start=False)\n",
            "confusion matrix\n",
            "[[ 25  20   0   1   0   0   0   0   0]\n",
            " [  5 123  24   0   0   1   0   0   0]\n",
            " [  1  30  90   1   2   2   0   0   0]\n",
            " [  0   1   1  20   0   5   0   1   0]\n",
            " [  1   0   3   5  21   8   0   9   0]\n",
            " [  0   0   0   9   3  71   0  17   0]\n",
            " [  0   0   1   1   1   1  11   6   1]\n",
            " [  0   1   3   9   3  10   4  62   2]\n",
            " [  0   0   0   0   0   0   0   0  31]]\n",
            "classification report\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           1       0.78      0.54      0.64        46\n",
            "           2       0.70      0.80      0.75       153\n",
            "           3       0.74      0.71      0.73       126\n",
            "           4       0.43      0.71      0.54        28\n",
            "           5       0.70      0.45      0.55        47\n",
            "           6       0.72      0.71      0.72       100\n",
            "           7       0.73      0.50      0.59        22\n",
            "           8       0.65      0.66      0.66        94\n",
            "           9       0.91      1.00      0.95        31\n",
            "\n",
            "    accuracy                           0.70       647\n",
            "   macro avg       0.71      0.68      0.68       647\n",
            "weighted avg       0.71      0.70      0.70       647\n",
            "\n",
            "Accuracy : 0.701700\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "irqsbQUQtinD",
        "colab_type": "text"
      },
      "source": [
        "##PCA的xgboost"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "InxbbzY7tfXO",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 312
        },
        "outputId": "c26eb131-1077-4e8c-95d1-9e4268409a90"
      },
      "source": [
        "#降到六维效果较好\n",
        "from xgboost import plot_importance\n",
        "from matplotlib import pyplot as plt\n",
        "\n",
        "import xgboost as xgb\n",
        "from numpy import loadtxt\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "params ={'learning_rate': 0.4,\n",
        "          'max_depth': 20,                # 构建树的深度，越大越容易过拟合\n",
        "          'num_boost_round':2000,\n",
        "          'objective': 'multi:softprob', # 多分类的问题\n",
        "          'random_state': 7,\n",
        "          'silent':0,\n",
        "          'num_class':10,                 # 类别数，与 multisoftmax 并用\n",
        "          'eta':0.8                      #为了防止过拟合，更新过程中用到的收缩步长。eta通过缩减特征 的权重使提升计算过程更加保守。缺省值为0.3，取值范围为：[0,1]\n",
        "        }\n",
        "model = xgb.train(params,xgb.DMatrix(X_train_PCA, y_train_PCA))\n",
        "y_pred=model.predict(xgb.DMatrix(X_test_PCA))\n",
        "\n",
        "model.save_model('testXGboostClass.model')  # 保存训练模型\n",
        "\n",
        "yprob = np.argmax(y_pred, axis=1)  # return the index of the biggest pro\n",
        "\n",
        "predictions = [round(value) for value in yprob]\n",
        "\n",
        "# evaluate predictions\n",
        "accuracy = accuracy_score(y_test_PCA, predictions)\n",
        "print(\"Accuracy: %.2f%%\" % (accuracy * 100.0))\n",
        "\n",
        "# 显示重要特征\n",
        "plot_importance(model)\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Accuracy: 69.86%\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "a-LZwlgpvzQw",
        "colab_type": "text"
      },
      "source": [
        "##PCA的knn"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "F07fqNykwM6b",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "import sys\n",
        "sys.path.append('/content/drive/My Drive/Colab Notebooks/Machine-Learning-From-Scratch-master')"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "FBMA7f24vy1N",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 325
        },
        "outputId": "b9b14489-680b-4891-b132-7321075f8aae"
      },
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn import datasets\n",
        "\n",
        "from utils import train_test_split, normalize, accuracy_score\n",
        "from utils import euclidean_distance, Plot\n",
        "class KNN():\n",
        "\n",
        "    def __init__(self,k=5):\n",
        "\n",
        "        self.k = k\n",
        "    def predict(self, X_test, X_train, y_train):\n",
        "\n",
        "        y_predict = np.zeros(X_test.shape[0])\n",
        "\n",
        "        for i in range(X_test.shape[0]):\n",
        "\n",
        "            distances = np.zeros((X_train.shape[0], 2)) #测试的数据和训练的各个数据的欧式距离\n",
        "\n",
        "            for j in range(X_train.shape[0]):\n",
        "                dis = euclidean_distance(X_test[i], X_train[j]) #计算欧式距离\n",
        "                label = y_train[j] #测试集到的每个训练集的数据的分类标签\n",
        "                distances[j] = [dis, label]\n",
        "\n",
        "                # argsort()得到测试集到训练的各个数据的欧式距离从小到大排列并且得到序列，然后再取前k个.\n",
        "                k_nearest_neighbors = distances[distances[:, 0].argsort()][:self.k]\n",
        "\n",
        "                #利用np.bincount统计k个近邻里面各类别出现的次数\n",
        "                counts = np.bincount(k_nearest_neighbors[:, 1].astype('int'))\n",
        "\n",
        "                #得出每个测试数据k个近邻里面各类别出现的次数最多的类别\n",
        "                testLabel = counts.argmax()\n",
        "                y_predict[i] = testLabel\n",
        "\n",
        "        return y_predict\n",
        "\n",
        "def run():\n",
        "    #初始化knn\n",
        "    model = KNN(k=5)\n",
        "    y_pred = model.predict(X_test_PCA, X_train_PCA, y_train_PCA)\n",
        "\n",
        "    accuracy = accuracy_score(y_test_PCA, y_pred)\n",
        "\n",
        "    print(\"Accuracy:\", accuracy)\n",
        "\n",
        "    # 用图画出测试集的分类情况\n",
        "    Plot().plot_in_2d(X_test_PCA, y_pred, title=\"KNN\", accuracy=accuracy)\n",
        "\n",
        "\n",
        "if __name__ == \"__main__\":\n",
        "    run()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Accuracy: 0.7047913446676971\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8GKtOcsHy6sB",
        "colab_type": "text"
      },
      "source": [
        "#LDA降维"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "5mGMcuvWy9rQ",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 281
        },
        "outputId": "2dd9cb1f-ce9b-46b5-84a7-e61d67d06ca2"
      },
      "source": [
        "import numpy as np\n",
        "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "def lda(data, target, n_dim):\n",
        "\n",
        "    clusters = np.unique(target)\n",
        "\n",
        "    if n_dim > len(clusters)-1:\n",
        "        print(\"K is too much\")\n",
        "        print(\"please input again\")\n",
        "        exit(0)\n",
        "\n",
        "    #within_class scatter matrix\n",
        "    Sw = np.zeros((data.shape[1],data.shape[1]))\n",
        "    for i in clusters:\n",
        "        datai = data[target == i]\n",
        "        datai = datai-datai.mean(0)\n",
        "        Swi = np.mat(datai).T*np.mat(datai)\n",
        "        Sw += Swi\n",
        "\n",
        "    #between_class scatter matrix\n",
        "    SB = np.zeros((data.shape[1],data.shape[1]))\n",
        "    u = data.mean(0)  #所有样本的平均值\n",
        "    for i in clusters:\n",
        "        Ni = data[target == i].shape[0]\n",
        "        ui = data[target == i].mean(0)  #某个类别的平均值\n",
        "        SBi = Ni*np.mat(ui - u).T*np.mat(ui - u)\n",
        "        SB += SBi\n",
        "    S = np.linalg.inv(Sw)*SB\n",
        "    eigVals,eigVects = np.linalg.eig(S)  #求特征值，特征向量\n",
        "    eigValInd = np.argsort(eigVals)\n",
        "    eigValInd = eigValInd[:(-n_dim-1):-1]\n",
        "    w = eigVects[:,eigValInd]\n",
        "    data_ndim = np.dot(data, w)\n",
        "\n",
        "    return data_ndim\n",
        "\n",
        "if __name__ == '__main__':\n",
        "    X=scaled_features\n",
        "    Y=correct_facies_labels\n",
        "    data_1 = lda(X, Y, 5)#自己根据数学原理实现LDA\n",
        "\n",
        "    data_2 = LinearDiscriminantAnalysis(n_components=6).fit_transform(X, Y)#直接调sklearn\n",
        "\n",
        "\n",
        "    plt.figure(figsize=(8,4))\n",
        "    plt.subplot(121)\n",
        "    plt.title(\"my_LDA\")\n",
        "    plt.scatter(data_1[:, 0], data_1[:, 1], c = Y)\n",
        "\n",
        "    plt.subplot(122)\n",
        "    plt.title(\"sklearn_LDA\")\n",
        "    plt.scatter(data_2[:, 0], data_2[:, 1], c = Y)\n",
        "    plt.savefig(\"LDA.png\")\n",
        "    plt.show()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 576x288 with 2 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "RdgUzBWRzd2h",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "X_train_LDA,X_test_LDA,y_train_LDA,y_test_LDA=train_test_split(data_2,correct_facies_labels,test_size=0.2,random_state=42)"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dz0XHR_Mzh3n",
        "colab_type": "text"
      },
      "source": [
        "##LDA的随机森林"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "zWoeshzizlY4",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 656
        },
        "outputId": "879ce12c-7adf-4b07-93e0-b0b1b819f039"
      },
      "source": [
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn import metrics\n",
        "\n",
        "rfmodel = RandomForestClassifier()\n",
        "rfmodel.fit(X_train_LDA,y_train_LDA)\n",
        "print('model')\n",
        "print(rfmodel)\n",
        "\n",
        "ypredrf1 = rfmodel.predict(X_test_LDA)\n",
        "print('confusion matrix')\n",
        "print(metrics.confusion_matrix(y_test_LDA, ypredrf1))\n",
        "print('classification report')\n",
        "print(metrics.classification_report(y_test_LDA, ypredrf1))\n",
        "print('Accuracy : %f' % (metrics.accuracy_score(y_test_LDA, ypredrf1)))"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "model\n",
            "RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,\n",
            "                       criterion='gini', max_depth=None, max_features='auto',\n",
            "                       max_leaf_nodes=None, max_samples=None,\n",
            "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
            "                       min_samples_leaf=1, min_samples_split=2,\n",
            "                       min_weight_fraction_leaf=0.0, n_estimators=100,\n",
            "                       n_jobs=None, oob_score=False, random_state=None,\n",
            "                       verbose=0, warm_start=False)\n",
            "confusion matrix\n",
            "[[ 31  14   1   0   0   0   0   0   0]\n",
            " [  4 119  28   1   0   1   0   0   0]\n",
            " [  0  28  95   1   0   1   0   1   0]\n",
            " [  0   0   1  23   1   1   1   1   0]\n",
            " [  0   2   1   3  21  11   0   9   0]\n",
            " [  0   0   0   7   2  70   1  19   1]\n",
            " [  0   0   0   1   1   1  13   5   1]\n",
            " [  0   0   1   9   3  15   2  60   4]\n",
            " [  0   0   0   0   0   0   0   0  31]]\n",
            "classification report\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           1       0.89      0.67      0.77        46\n",
            "           2       0.73      0.78      0.75       153\n",
            "           3       0.75      0.75      0.75       126\n",
            "           4       0.51      0.82      0.63        28\n",
            "           5       0.75      0.45      0.56        47\n",
            "           6       0.70      0.70      0.70       100\n",
            "           7       0.76      0.59      0.67        22\n",
            "           8       0.63      0.64      0.63        94\n",
            "           9       0.84      1.00      0.91        31\n",
            "\n",
            "    accuracy                           0.72       647\n",
            "   macro avg       0.73      0.71      0.71       647\n",
            "weighted avg       0.72      0.72      0.71       647\n",
            "\n",
            "Accuracy : 0.715611\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_p7V3pE-08yH",
        "colab_type": "text"
      },
      "source": [
        "##LDA的xgboost"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "rgW1u8mh1BhI",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 312
        },
        "outputId": "643c5dc2-2167-46d5-a87b-a79441223232"
      },
      "source": [
        "from xgboost import plot_importance\n",
        "from matplotlib import pyplot as plt\n",
        "\n",
        "import xgboost as xgb\n",
        "from numpy import loadtxt\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "params ={'learning_rate': 0.4,\n",
        "          'max_depth': 20,                # 构建树的深度，越大越容易过拟合\n",
        "          'num_boost_round':2000,\n",
        "          'objective': 'multi:softprob', # 多分类的问题\n",
        "          'random_state': 7,\n",
        "          'silent':0,\n",
        "          'num_class':10,                 # 类别数，与 multisoftmax 并用\n",
        "          'eta':0.8                      #为了防止过拟合，更新过程中用到的收缩步长。eta通过缩减特征 的权重使提升计算过程更加保守。缺省值为0.3，取值范围为：[0,1]\n",
        "        }\n",
        "model = xgb.train(params,xgb.DMatrix(X_train_LDA, y_train_LDA))\n",
        "y_pred=model.predict(xgb.DMatrix(X_test_LDA))\n",
        "\n",
        "model.save_model('testXGboostClass.model')  # 保存训练模型\n",
        "\n",
        "yprob = np.argmax(y_pred, axis=1)  # return the index of the biggest pro\n",
        "\n",
        "predictions = [round(value) for value in yprob]\n",
        "\n",
        "# evaluate predictions\n",
        "accuracy = accuracy_score(y_test_LDA, predictions)\n",
        "print(\"Accuracy: %.2f%%\" % (accuracy * 100.0))\n",
        "\n",
        "# 显示重要特征\n",
        "plot_importance(model)\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Accuracy: 66.46%\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "D_0IvLzX1V4X",
        "colab_type": "text"
      },
      "source": [
        "##LDA的knn"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JnQNy5MT1Vek",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 325
        },
        "outputId": "e7f4ffa4-08f0-400e-e859-1cea8a0170d3"
      },
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn import datasets\n",
        "\n",
        "from utils import train_test_split, normalize, accuracy_score\n",
        "from utils import euclidean_distance, Plot\n",
        "class KNN():\n",
        "\n",
        "    def __init__(self,k=5):\n",
        "\n",
        "        self.k = k\n",
        "    def predict(self, X_test, X_train, y_train):\n",
        "\n",
        "        y_predict = np.zeros(X_test.shape[0])\n",
        "\n",
        "        for i in range(X_test.shape[0]):\n",
        "\n",
        "            distances = np.zeros((X_train.shape[0], 2)) #测试的数据和训练的各个数据的欧式距离\n",
        "\n",
        "            for j in range(X_train.shape[0]):\n",
        "                dis = euclidean_distance(X_test[i], X_train[j]) #计算欧式距离\n",
        "                label = y_train[j] #测试集到的每个训练集的数据的分类标签\n",
        "                distances[j] = [dis, label]\n",
        "\n",
        "                # argsort()得到测试集到训练的各个数据的欧式距离从小到大排列并且得到序列，然后再取前k个.\n",
        "                k_nearest_neighbors = distances[distances[:, 0].argsort()][:self.k]\n",
        "\n",
        "                #利用np.bincount统计k个近邻里面各类别出现的次数\n",
        "                counts = np.bincount(k_nearest_neighbors[:, 1].astype('int'))\n",
        "\n",
        "                #得出每个测试数据k个近邻里面各类别出现的次数最多的类别\n",
        "                testLabel = counts.argmax()\n",
        "                y_predict[i] = testLabel\n",
        "\n",
        "        return y_predict\n",
        "\n",
        "def run():\n",
        "    #初始化knn\n",
        "    model = KNN(k=5)\n",
        "    y_pred = model.predict(X_test_LDA, X_train_LDA, y_train_LDA)\n",
        "\n",
        "    accuracy = accuracy_score(y_test_LDA, y_pred)\n",
        "\n",
        "    print(\"Accuracy:\", accuracy)\n",
        "\n",
        "    # 用图画出测试集的分类情况\n",
        "    Plot().plot_in_2d(X_test_LDA, y_pred, title=\"KNN\", accuracy=accuracy)\n",
        "\n",
        "\n",
        "if __name__ == \"__main__\":\n",
        "    run()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Accuracy: 0.7047913446676971\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "NVmhpLy3sEHP",
        "colab_type": "text"
      },
      "source": [
        "#KPCA降维"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "NITCJaacsDip",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 281
        },
        "outputId": "aba9d096-456c-45fa-ba3b-6b80f009875d"
      },
      "source": [
        "#PCA算法的非线性扩展\n",
        "from sklearn.datasets import load_iris\n",
        "from sklearn.decomposition import KernelPCA\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "from scipy.spatial.distance import pdist, squareform\n",
        "X = scaled_features\n",
        "Y = correct_facies_labels\n",
        "sklearn_kpca = KernelPCA(n_components=4, kernel=\"rbf\", gamma=15)\n",
        "data_3 = sklearn_kpca.fit_transform(X)\n",
        "plt.subplot(122)\n",
        "plt.title(\"sklearn_KPCA\")\n",
        "plt.scatter(data_3[:, 0], data_3[:, 1], c = Y)\n",
        "plt.show()"
      ],
      "execution_count": 21,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAL0AAAEICAYAAAAKp/VCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd3xUZdbA8d+ZmkICgQABIgSkSBeIoosoioK9vBaws6tiXdd19XVdXcX2qmtf2+q6RV0b4hZUXAsqNpAqIFjonZBACJAy9Xn/mElMmSST5CYzkznfzycfZ+698zxn8OTmufc+91wxxqBUMrHFOgCl2pomvUo6mvQq6WjSq6SjSa+Sjia9Sjqa9CrpaNI3QkRmiMg/mrpOxS9N+nZGRDaKyPHV3k8VkWIROUZE8kTEiMiB8M9GEflttW1FRK4XkW9FpFREtorImyIyvFYfM8LtjG3L72YVTfo4JCIOi9q5FHgaOMUYM6/aqk7GmA7A+cAdInJiePkTwK+A64HOwEDg38Ap1doU4BJgT/i/CUeTvhoRuUVEtonIfhH5QUQm1lrvFJHXROQtEXFF+PwRIvKViOwVkeUiMqHaup+LyHfhtteLyJXV1k0I71VvEZGdwN/Ce9OZIvJS+DOrRCS/Cd/lSuARYLIx5qtI2xhj5gOrgGEiMgC4FjjfGPOxMcZjjCkzxrxijHmg2sfGAz0I/WJMjfTvEO806cNEZBBwHXCYMSYDmAxsrLY+ldBezwOcZ4zx1vp8L+Bd4F5Ce8mbgLdEpGt4k13AqUAm8HPgMREZXa2JnPDn+gDTw8tOB14HOgGzgaei/DpXA3cDE40xi+v5viIi44ChwDJgIrDVGLOwkbYvBd4GZobfnxZlTHFDk/4nAcANDBERpzFmozFmXXhdJvBfYB3wc2NMIMLnLwLmGGPmGGOCxpgPgcXAyQDGmHeNMetMyDzgA0J7zUpB4M7wHrY8vOyLcHsB4GVgZJTf5QRgAbCynvVFhIYnLwC/NcbMBboAOxpqVETSgHOBV40xPmAWCTjE0aQPM8asBW4AZgC7ROR1EekZXn0EMAJ4wNQ/LbUPcG54aLNXRPYCRxEaCiAiJ4nIAhHZE153MpBd7fOFxpiKWm3urPa6DEiJcrx/NaHx+AvhMXht2caYLGPMYGPMH8PLdlfG2oCzAD8wJ/z+FeCkan/NEoImfTXGmFeNMUcRSmADPBhe9QFwPzBXRLrX8/EtwMvGmE7VftKNMQ+IiBt4C3gY6G6M6UQocaonpJVzvAsIDVfGA89E+Zm5QG4jxw2XAh2AzeFjjzcBJ3BBC2Jtc5r0YSIySESOCydoBVBOaMgBgDHmD8CrhBI/O0IT/wBOE5HJImIXkZTwAWou4CI0dCoE/CJyEjCpNb+PMWY7ocQ/UUQei2L7NYR+QV4Lx+0Kf4epIvLb8DHLRELHJYeGf0YS2jEk1BBHk/4nbuABQuPdnUA34NbqGxhj7iF0MPuRiHSutW4LcAbwO0LJvQW4GbAZY/YTOtsxEygmtGec3ZpfJhzTZuA44BwRuT+Kj1xP6GD5aWAvoWOYswgduF4MfGOM+cAYs7PyB/gjMEJEhrXKl2gFondOqWSje3qVdCy58qfajoj0BlbXs3pIeEijGqDDG5V0Yranz87ONnl5ebHqXrVzS5YsKTLGRLx+ELOkz8vLY/HiiFfIlWoxEdlU3zo9kFVJR5NeJR1NepV0NOlV0omr8/SBQIA1S9YjIvQf3Re73R7rkFQ7FDdJv/Lz77jrnIfxVoTuzXCnurnzrZsYNu6QGEem2pu4GN7s27Of353yf5QU7qN8fwXl+yvYu6uE3518Hwf2lsY6PNXOxEXSz3vjK0wgWGd5wBfgszfnxyAi1Z7FRdKXFO3HU+6ts9xb4WPrmu0xiEi1Z3GR9Dl967/brHDr7jaMRCWDuEj6tMw0bLbIoRRt3dPG0aj2Li6SPm9Yb4LBumN6gPIDte+VVqpl4iLpnS4HkW/ah50bd7VxNKq9i4ukT8tIob55/d4KXxtHo9q7uEh6d5q73nV+n78NI1HJIC6S3u6wk5aZGnFdlx6dIy5XqrmiSnoROTFc0HRt9dLO1dY/JiLfhH9+DFfwipqIMPWWM0mptcd3p7m5+I5zmtKUUo1qdO6NiNgJ1UE5AdgKLBKR2caYqpuTjTG/rrb9L4FRTQ1kyi1n4qnw8taj72CCBrvTzgW3nc1Jl01s/MNKNUE0E84OB9YaY9YDiMjrhIoa1XdH/vnAnU0NxGazMe2uqUz53zNY/ulqOud0YsDofvWe1VGquaJJ+l6EqnVV2gpEfAKFiPQB+gIf17N+OuEy1L17966zfuF7y3jgoicI+IMETZCO2Znc859b6Du8TxRhKhUdqw9kpwKz6illjTHmeWNMvjEmv2vXmlMPCjYVcve5D7O/uJSy/eVUHPBQsLGQmybehc+rpy2VdaJJ+m3AQdXe54aXRTIVeK05gbz/908I+OtelfV7/Cycs6w5TSoVUTRJvwgYICJ9w49amUqE4qMicgiQBTRrLvCeHcX4vXXPyQcCQUoK9zWnSaUiajTpjTF+Qo+leR/4DphpjFklIneLyOnVNp0KvN7AQwsaNGbSoaR2SInUPyOOGdKcJpWKKKrbBY0xc/jp6ROVy+6o9X5GSwL52en55A3rzfoVG/GUhebWp6S7OXbqUeQO7NnIp5WKXtzcI2t32Hn44zuZ88Jc5r7yOe5UF6deeQLHnPezWIem2pmYFXDNz883WtZPtRYRWWKMifgoobiYe6NUW9KkV0lHk14lHU16lXQ06VXS0aRXSUeTXiWduEz6fXv2s3rBj+zZWRzrUFQ7FDdXZAGCwSDP3PA33nnuQzCheTcjJwzl3nduxeV2xjo81U7E1Z7+rcfeYfYz7xPwBQj4AwQDQZbNXcnNx82IdWiqHYmrpH/t/n9hgnWnRaye/yN7Cpp0r7lS9YqrpC8tKat33bKPVrZhJKo9i6ukz8rpFHG5iNCpW2YbR6Paq7hK+isevCjicmeKg0OPHdbG0aj2Kq6SPrVDCnZnhIerGfB69OZwZQ1LKpyFtzlPRFaLyCoRebU5wcx95XMCvrqFFBwuB8s/WdWcJpWqw5IKZyIyALgVGGeMKRaRbs0Jxu6o/xGadkdc/VFSCSyaTKqqcGaM8QKVFc6quwJ42hhTDGCMaVZR+UmXTiAlPXIF45EThjanSaXqiCbpI1U461Vrm4HAQBH5UkQWiMiJkRoSkekislhEFhcWFtZZP+aEEZz4i+Nwp7pwuh2kpLtJSXdz56ybcKW4ovxKSjXMqmkIDmAAMIFQMajPRGS4MabGFSVjzPPA8xC6R7Z2IyLCtU/8glOvmsSS95eTlpnKUf8zlg6d0i0KU6nokj6aCmdbga+NMT5gg4j8SOiXYFFzguozOJc+g3Ob81GlGmVVhbN/E9rLIyLZhIY76y2MUynLWFXh7H1gt4isBj4BbjbG6ANgVVzSujeqXdK6N0pVo0mvko4mvUo6mvQq6WjSq6SjSa+Sjia9Sjqa9CrpxFXdm+qKd5Xw6etfsm/PfkZPHMGwow7RBykrS8Rl0i+du5I7z3iQYDCI1+Nj1iNvM/r4Edwx6zfY7fXfaKJUNOJueOP3+bnnvEeoKPPgtTmgQzoV5T6WfrSCT1//KtbhqXYg7pL+uwVr8IsN26B+2Pr0wpbbA9shB+NJSeWDFz+NdXiqHYi74Y0BfN26gd1ecwzfvStl/thMjlPtS9wlPSlujAhm7z6CRXsgEID0NGzdsnHlZMc6OtUOxN3wprzch714L2Z7AXi84A9AyX6C6zZhs8dduCoBxV0W5eV1wVewG2rP8w8Gse0tiU1Qql2xpNiTiEwTkUIR+Sb8c3lzAyrauhtXSuRa9CXbiprbrFJVLCn2FPaGMea6lgbUNbdz3b18KA569s9pafNKWVbsyTLdendl5DFDcbpr/j66UpxMubnVulVJxKpiTwBni8gKEZklIgdFWN9osadK1z11GWKrNeVAqLf6mVJNYdWB7NtAnjFmBPAh8GKkjYwxzxtj8o0x+V27dq23sVfufYuAL1hjmbfcy0O/eMaicFUyiybpGy32ZIzZbYzxhN++AIxpSVBf/WcRAX/N6sXGwNql6ykvrWhJ00pZU+xJRHpUe3s6ofo4zeaIVKM+1BF2PVevWsiqYk/Xh+vSLweuB6a1JKhJ046tc9rS7rCTP2mkFnJVLRaXxZ485R5uPek+1ixZjwkabA4bXXpk8ei8u8nqHvm5VEpV11Cxp/ibewO4U9088sldfPf1Gjas2ESPft059Lhh2Gw6tFEtF5dJD6GLUUOOGMiQIwbGOhTVzuiuUyUdTXqVdDTpVdKJ2zE9wI9L1vHqfW+xafVW+o/qy4W3n0Pe0IgzHJSKWtwm/dK5K7njjAfwlnsxBrav3cmCt5fw8CczGHRY/1iHpxJY3A5vnr7+L3jKvFWzjINBQ0WZh2dvjDitR6moxWXS+31+tny/PeK6HxevbeNoVHsTl0lvd9jrnUac0TmjjaNR7U1cJr2IcPo1k7HXmnhmd9o59zenxSgq1V7EZdID9BzQgzrzggx0yNIHKauWidukf/mumQT9NW8kCfgDvDRjZowiUu1F3Cb97m3FEZcXbdvTxpGo9iZuk757n8i3E+bkdWvjSFR7E7dJf/kDF+JOq3nDiDvVxWX3XxijiFR7EbdXZI8572fYHHb++rtX2blxFzl9u3HZ/13AUWeNjXVoKsFZUuGs2nZni4gRkYh3rDTV2JNHMe7Mw0jLSKVoy24++sdn7Ny4y4qmVRKzrMKZiGQAvwK+tiq4Gf/zEMvnrcJb7gNg/n8WsfLz7/jb90+QqRepVDNZWeHsHuBBwJIaHRtXbWHFvNVVCQ/h+TelHt57Ya4VXagkZUmFMxEZDRxkjHm3oYairXAGsGHlZmyOuqVAvOVevl+o829U87X47I2I2IBHgd80tm20Fc4AevbPwQSDdZa7Upz0Hd67ueEqZUmFswxgGPCpiGwEjgBmt/RgduCYfvQeklunpqWIcMr0E1rStEpyLa5wZowpMcZkG2PyjDF5wALgdGNM5KI2URIRsntkUfvRscYYDhQfaEnTKslZVeHMckXbdrP4g+UEAzUnnfl9AWY+NLueTynVuKguThlj5gBzai27o55tJ7Q8LNixfhdOtxNvha/G8mAgyMZvN1vRhUpScTsNIXdQzzoJD6EbTAYdrvfIquaL26TP6taREy4+us78G1eqk3NvarVRlUoCcTv3BuD6Z68gp183/v3H9ygtKWPouEO46tFL6dG3e6xDUwksLqsWK9VSDVUtjtvhjVKtRZNeJR1NepV0NOlV0tGkV0lHk14lnbhP+v3FB3jk8mc5o+MlnJ55MX+Y9hQlRftiHZZKYHF9cSoQCHDDUbezfV0Bfq8fgE9e+4JVX37PX1Y/jsMZ1+GrOBXXe/pF731D4dbdVQkPoVmWxQUlfPWfRTGMTCWyuE76DSs34ynz1llefqCCDSt1pqVqnrhO+tyBPepMOANI7ZBC7sCeMYhItQdxnfRHnDaGjKwO2Ow/hWmz20jNSGX82Vr0STWPJcWeROQqEVkpIt+IyBciMsSK4JwuJ098dR+HnTQKu8OGzW5jzPEjeHL+fbhS6v4FUCoajc6yDBd7+pFqxZ6A86sXexKRTGPMvvDr04FrjDEnNtRuU2dZBvwBIHQTiVKNaeksy0aLPVUmfFg6YPl8ZbvDrgmvLBHNie5IxZ7qDKhF5FrgRsAFHBepIRGZDkwH6N1ba9eo2LDsQNYY87Qx5mDgFuD2eraJutiTUq3FimJPtb0OnNmSoGrbsaGABy55kqm5V3L1mP/l0ze+rPs8KqWiFM3wpqrYE6FknwpcUH0DERlgjFkTfnsKsAaL7NpSxDVjbqFsfznBQJDd2/fwyGXPsm3NDi68/RyrulFJxKpiT9eJyCoR+YbQuP5SqwJ848F/U15aQTDwU13LijIPr93/L8oPlFvVjUoilhR7Msb8yuK4qqyYt5qAL1Bnud1pZ/P32xmUf3Brda3aqbi+IguQ0zfyg9X8Xj9dema1cTSqPYj7pJ9yy5l15t843U5GTRxOds/OMYpKJbK4T/ph4w7hpr9cQ8fsDNxpLpxuB0eeNobbXrsh1qGpBJUQd2FMmDKO8eccQeGW3WRkpZPeMT3WIakElhBJD2C32/XBycoScT+8UcpqmvQq6WjSq6SjSa+Sjia9Sjqa9CrpaNKrpKNJr5KOJr1KOpr0Kulo0quko0mvko5VFc5uFJHVIrJCROaKSB/rQ1XKGo0mfbjC2dPAScAQ4PwIZfuWAfnGmBHALOAPVgeqlFWsqnD2iTGmLPx2AaEyIUrFpWiSPlKFs14NbH8Z8F6kFSIyXUQWi8jiwsLC6KNUykKW3kQiIhcB+cAxkdYbY54HnodQAdemtr9rcyFzX/2C0pIyDj9pFMPHD0ZEWhSzSj7RJH1UFc5E5HjgNuAYY4zHmvB+8vlbC3jgkicJBoL4vX7+89R7HH7yaG577QZsNj0JpaIXTbZUVTgTERehCmezq28gIqOA54DTjTG7rA6yvLSCP1z6FN5yb9XzpypKPSycs1SfPaWazKoKZw8BHYA3ww9mmF1Pc82yYt5qbI66oVaUevj4lc+t7EolAasqnB1vcVw1VH/8Tm12faymaqKEGAyPnDA04gFrSrqbSdMmtH1AKqElRNK73E7ufOsm3GluHG4nYrdhd9qZcP548ieNjHV4KsEkRNID9BiUS+rIQUhOV+iWjX1AX75cuYsNawpiHZpKMAmT9H9++D1KS70EMzKwdckiYLNTVurhibv+HevQVIJJmKRf8tUagsG617PWrNqGN3waU6loJEzSu9zOiMttdht2m16VVdFLmKSffNYYXO6apycdTjtHnTBUH7WpmiRhkv7iaycyIr8v7hQnqeluUlKdHDyoB7+87fTGP6xUNQlzZcflcnDvs5eycU0BG9bspFefbAYM6akTzlSTJUzSV8ob0J28Ad1jHYZKYAkzvFHKKpr0Kulo0quko0mvkk7CHciuX7GJt599n93bixl7ymiOv/ho3KnuWIelEkhCJf3Hr33Oo1f8CZ/HTzAQZNnHK/nXk+/x5Pz7SO2QGuvwVIKwqtjT0SKyVET8InKO9WGCt8LL41c9j6fMSzAQBEJ3Tu1YX8Dbf/qwNbpU7ZRVxZ42A9OAV60OsNLaZRsiXojylnv5bNb81upWtUPRDG+qij0BiEhlsafVlRsYYzaG1wVbIUYAUjNSq/bwtWV00ocpq+i1RrGnVpE39CC65nZBas2oTEl3c/q1J7Z1OCqBtekpy5ZUOBMR7n3nVrodlE1qRgppmak43U7O+tXJHHlafitFrNojy4o9RaOlFc56HpzDS+ueYtWXP1BStI8hRw6kc05Wc0JRSSyapK8q9kQo2acCF7RqVA2w2WwMHz84Vt2rOLG7cD/FRfvJzcsmJdXVpM82mvTGGL+IVBZ7sgN/rSz2BCw2xswWkcOAfwFZwGkicpcxZmjTv4pSNW1ev4uNa3eR26cL/Qb1oKzUw4O/ncnS+etwOu0Eg0EuvPo4zp02Puo2rSr2tAgtz61aYNeOvSxfuJ4OmamMGTcAgHt+/SorFm3AbrcRCAQZMKQn6RkpLJ2/Fp83gC98b/Q/nv2Yngd1YdzE2mfSI0uoK7Iq8W1at4uVizdQUlzK0gVr2b55D06Xgz2F+3E47YiA3W5n7DGDWL5wPV7PTzf9f79yC4GAwdQqEOAp9zHzr59p0qvY2LVjLyXFpfTu1w13yk838weDQR6941989v5KTNDg8wXqfNZfbdnH73yDMbXX138ZaE/R/qhj1KRXzbJ9y242rd1F/8E9KNi2l5efmct3K7bg9wWqKldcfuNkTp0yFoB5763kiw+/rbHnbkjthG+IzS6MGntw1Ntr0qsGFRXsY8Gn3yEiHDHhENIzUvjl1GfYsqGoahuRmklaUe4F4M+P/JdefbIZdcTBvDtrERXlvqj7tdltmGCwTvLn5GZRXHQAT0WoLbvDRmqaiwuuPDbqtjXpVQ3BYJCP313Of/+5hKKdJRQWlOAIl1h57qE5dM7OYOe24hqfqW+v7Knw8dZLXzDqiIOrnisQLYfDhsvtxuvx4fX4cbrsOJwO7nj8QvaXlPHmXz+nYPteRh7WlymXH03XnE7Rt92kSFS7sHr5Zt55/WtKiksZd/xQjj/t0KohyQO3zGThZz/U2CsH/D+NpWsnfGN2F+wD4LhTD2XDmoKqPXR97HYbDqedG2acyegj+zPnzUX88O1W+g3M4ZTzDqdLt0wARh7Wr0lxVKdJ304FAkE+mbOcD/61FINh0hmjOe7UQ3l35kL+8tj7eD1+jDF8u3QT776xkEdfns7m9bv4et4PjSZmtBxOO/lHDQTgxLPz+fS9Faz/cScVZV5sNiEYNDhddmw24YgJg3G5HXTMSmfyWWM4qG9XAM6fPsGSWGrEZXmLbWRvYQm7txfTa0APUtL0zqnqjDHcd9PrLP1qTdUee82qbcx7fyUrFm2ocTDpqfCxdVMRH81eRkWFr96ZrE1ls9vIyEzl7EvGAaG6RQ/97XIWfvYDS+evpXN2B46ePAK7w0bnrhm4XG2XigmX9BVlHv4w7SkWvL0Ep9tBwB/kot+fzdRbzop1aK3C6/Xz1dzVbNu8m34Dczh8/MBGyxh+t2JLjYQHqCj3sXzheuwRnuriqfDx5dxVHHfqoTic9oinEyvZ7UIgUHcQb7fbsDvs+Lx+OmalMfG0Qzln2ng6delQY5sjjx3MkcfGdhpJwiX941c+x4K3F+Pz+PF5Qv9TX757Fjl53ZgwZVyMo2u5ooJ9vPm3z1mxaD2dunRg3fc78Hn9VJR7SUl10aVbJo+9PJ2Mjmn1trFi0YaIlZx93gAmQh1cEcjslMa4iUN45v53IrZpswlOl4Oplx9DRsdU/v7kR5QdqCAzK42rbj6Z0T8bwJ7C/eT0yiIlrWlzYdpaQiV92f5y5s2cj99X83+ot9zLy3e/mfBJX7C9mOvOe4ayMk/o4LHWAyfKy7zs3FbMC4+9z69n1P+XLbNTGk6nA0+g5tjc5Xbgdjs54C+vccbF5XZy6pSxpKa5uf/5n3P3Da9QdsADItjswtjxg8jJzeLoScOrqstVnn+v3W8iSKikP7C3lIA/8p/e7et2tnE0dRljWlRb85U/fUJpaQXBCMOHSn5fgM/f/7bBpB8/aRh/frjuQ9ttdhv3PHsJ9/3mdQ7sK0dsgt8X4NJfHs+w0XkADBqWy8sf3Mz6H3YSCATpP7hnxCFRIkuopO/SMwtTz0lhv7f+cWhrqEzwooJ9vPGXeXz+4bfs3V1KWrqLMy44kouuPq7JJcSXLVjXYMJHKyMzlXueuYR7b3wtdCZGBJfLwe2PTOWQ4Qfx4n9/w/crtrJ/XzlDD+1Nh8yalSRsNhv9B/dscRzxKqGSPhZPBg8Gg4gIAX+QT/+7grdf+5otGwspO+DBneLA5wvUSNSyUi9vvfQlxbsPcEMDe+NIOnXpQOHOkga3cTjtjJ88rNG2ho3O45W5t7B29XaMMQwY2qtqj22z2RhyaO8mxdaeJFTSB4PW33ce8AcoPeChQ2ZKjV+qH77dylP3vc3a1dtwp7jokJlCSXEpvmp/UTwVka8yej1+5r7zDb+4YXKTxrnnTjuKR37/zzrnyW02wRhTdSB7+a8nR9We3W5j0HCd8V1bQiW93W4Huw0inUt2uygtKSW9Y+TKCH5/gLUbC0lLc9G7Z2eCwSCvPPcJ/3zxS/y+AClpLi697nhOnTKWbZuKuOWyv1bNIako91a9jpbT5WDntuImJf3Rk4ezbdNuXv/zPOxOG35fgGGj8zjmxOEU7doX9SlL1bCESnoAZ4+u+LbWfYymdMzk+5XbGDA8l/QOKdjtNpYtXMdfnv6IzZt3U+oE6ZyGEeiV04lxB3VnzusLq/aqvpJy/vzIf0nPSOHbJRurblBoLr83QI/cpt+/e/70CZxx4ZFsWV9I564ZdM3p2KI4VF1RJb2InAg8Qeh2wReMMQ/UWu8GXgLGALuBKZW1cKzmcjnwATv+OICyYBZg6OwuIOuaLdx61YuITRDA4bTh95vQASfgEAgWe6jI7cDGLUXs+nQd1Dpo9FT4+MezH5ORmUqgBVcmnU47J5wxqsFz6Q1JS3frsKQVWVXh7DKg2BjTH3gMeNDqQKvs28+6xw+nLNgZEMDGHk8P1j02BlNWhgCG8A0H4YQHEAM2bwDHfi/BgMHUc5akqGBf6KDPEf1Bs61aLR6ny8GUy4/mmt+d1txvqFqZJRXOwu9nhF/PAp4SETH1nV9sgRW39yeU7LXPh9vZc6Odrs9Tlfi1txADjgM+/JkucNjAX3dv3qd/d86+ZBwfzV5Guf+ncbwjfBOy0+UIFZANGtIzUjh1yuF0y+lEeZmX/KMGkNdfHw0U76JJ+kgVzmpfjqvaJlw9oQToAhRV30hEpgPTAXr3bu4ps8jPkwUoDnanK/Wf8jOAsQuI4O+WSvpuT43JV+4UJ5ffOJmc3M488uIVPPPAu3y3fDNp6W5OnTKWsy8Zxw/fbsXtdjL40N7t7qJNsmjTA9mWFnv6/TNnAeOouw+vp7/aWwr4OrpJcTs564zDGNO7Oy89/REF24rp0787v/jVJIaNyQOg36AePPy3y+u0OeZnA5oatoozVlU4q9xmq4g4gI6EDmgtdebhO3jlq4a28ABgJDSUqXxdeT+bv1sah4zI5cIzD+fosQOqboFTycWqCmezgUuB+cA5wMetMZ73Bly4bAfwBjtQcx8e6urgFyoI2oEgpKW5uO+5aRzYX8F3P+5g2Og+jB7ZR587q5BoclNETgYe56cKZ/fVqnCWArwMjAL2AFMrD3zrk5+fbxYvXhx1oEF/IQe2HYXLDkP++XNq/77OOGQWWYE/MX5sfzIyU/UCTpITkSXGmIiVfaNK+tbQ5KQvnAKBZSzfms2IXkUs3tOFVzcOZmznHRzTeQs9Dp6PzZHRihGrRNJQ0ifOFdnAMgBG5hZR7hVSvXBFz+/o4C4jp6NXE15FLSGSPuj5scb7VJdhWI9qx8kZD2rUCSYAAAM8SURBVLVxRCqRJcaJZnvDl/Nt6We0USCqPUiIpLc5GpqHomdjVNMkRNIDkPl45OWd327bOFTCS5ikt6WdDNnfgiMfpBO4ToBu32NzDYx1aCrBJMSBbCWbwwXZrfaoWpUkEmZPr5RVNOlV0tGkV0lHk14lHU16lXRiNuFMRAqBTRY0lU2tO7TaWCz7177r18cY0zXSipglvVVEZHF9s+nae//ad/Po8EYlHU16lXTaQ9I/n8T9a9/NkPBjeqWaqj3s6ZVqEk16lXQSJulF5EQR+UFE1orIbyOsd4vIG+H1X4tIXhv2faOIrBaRFSIyV0T6WNV3NP1X2+5sETEiYtmpxGj6FpHzwt9/lYhYNg02in/33iLyiYgsC//bnxxVw8aYuP8hVHpkHdAPcAHLgSG1trkG+FP49VTgjTbs+1ggLfz6aqv6jrb/8HYZwGfAAiC/Db/7AGAZkBV+360N+34euDr8egiwMZq2E2VPX1VE1hjjBSqLyFZ3BvBi+PUsYKJYU9mp0b6NMZ8YY8rCbxcQqgJnlWi+O8A9hKpFV7Rx31cATxtjigGMMbvasG8DZIZfdwS2R9NwoiR9pCKyverbxhjjByqLyLZF39VdBtR9tF8r9i8io4GDjDHvWthvVH0DA4GBIvKliCwIP8ugrfqeAVwkIluBOcAvo2k4oe6cincichGQDxzThn3agEeBaW3VZy0OQkOcCYT+wn0mIsONMXvboO/zgb8bYx4RkSOBl0VkmDGmwSdqJMqevilFZLG4iGw0fSMixwO3AacbYzwW9Btt/xnAMOBTEdkIHAHMtuhgNprvvhWYbYzxGWM2AD8S+iVoi74vA2YCGGPmAymEJqM1zKoDrtb8IbQ3WQ/05aeDmqG1trmWmgeyM9uw71GEDroGxOK719r+U6w7kI3mu58IvBh+nU1oSNKljfp+D5gWfj2Y0JheGm07FknczH+EkwntRdYBt4WX3U1oz0r4t/xNYC2wEOjXhn1/BBQA34R/Zrfld6+1rWVJH+V3F0LDq9XASkLFe9uq7yHAl+FfiG+ASdG0q9MQVNJJlDG9UpbRpFdJR5NeJR1NepV0NOlV0tGkV0lHk14lnf8HJh2nos8NaaIAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "c8egS-b6t3g-",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "X_train_KPCA,X_test_KPCA,y_train_KPCA,y_test_KPCA=train_test_split(data_3,correct_facies_labels,test_size=0.2,random_state=42)"
      ],
      "execution_count": 22,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ldZxUEk_uI4Y",
        "colab_type": "text"
      },
      "source": [
        "##KPCA的随机森林"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "OhZ9x7GwuIT5",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 656
        },
        "outputId": "56c94ecc-c97d-4eab-e83c-ea376960d686"
      },
      "source": [
        "from sklearn.ensemble import RandomForestClassifier\n",
        "from sklearn import metrics\n",
        "\n",
        "rfmodel = RandomForestClassifier()\n",
        "rfmodel.fit(X_train_KPCA,y_train_KPCA)\n",
        "print('model')\n",
        "print(rfmodel)\n",
        "\n",
        "ypredrf1 = rfmodel.predict(X_test_KPCA)\n",
        "print('confusion matrix')\n",
        "print(metrics.confusion_matrix(y_test_KPCA, ypredrf1))\n",
        "print('classification report')\n",
        "print(metrics.classification_report(y_test_KPCA, ypredrf1))\n",
        "print('Accuracy : %f' % (metrics.accuracy_score(y_test_KPCA, ypredrf1)))"
      ],
      "execution_count": 23,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "model\n",
            "RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,\n",
            "                       criterion='gini', max_depth=None, max_features='auto',\n",
            "                       max_leaf_nodes=None, max_samples=None,\n",
            "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
            "                       min_samples_leaf=1, min_samples_split=2,\n",
            "                       min_weight_fraction_leaf=0.0, n_estimators=100,\n",
            "                       n_jobs=None, oob_score=False, random_state=None,\n",
            "                       verbose=0, warm_start=False)\n",
            "confusion matrix\n",
            "[[12 20  4  0  2  2  0  4  2]\n",
            " [16 51 31  5  6 14  6 19  5]\n",
            " [ 6 25 45  3  7 14  0 24  2]\n",
            " [ 2  6  4  3  1  7  0  5  0]\n",
            " [ 2  4 12  2  7 12  1  6  1]\n",
            " [ 5 24 25  4  5 12  1 22  2]\n",
            " [ 0  3  5  1  0  4  1  5  3]\n",
            " [ 6 19 31  3  3 10  1 21  0]\n",
            " [ 0  1  1  0  0  1  0  3 25]]\n",
            "classification report\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "           1       0.24      0.26      0.25        46\n",
            "           2       0.33      0.33      0.33       153\n",
            "           3       0.28      0.36      0.32       126\n",
            "           4       0.14      0.11      0.12        28\n",
            "           5       0.23      0.15      0.18        47\n",
            "           6       0.16      0.12      0.14       100\n",
            "           7       0.10      0.05      0.06        22\n",
            "           8       0.19      0.22      0.21        94\n",
            "           9       0.62      0.81      0.70        31\n",
            "\n",
            "    accuracy                           0.27       647\n",
            "   macro avg       0.26      0.27      0.26       647\n",
            "weighted avg       0.26      0.27      0.26       647\n",
            "\n",
            "Accuracy : 0.273570\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "qhNL990iuxYF",
        "colab_type": "text"
      },
      "source": [
        "所以证明我们这个数据不是非线性的"
      ]
    }
  ]
}